fix: guard against local variable array overflow from for-loop hidden variables
Add a bounds check in `forStatement` to ensure there is space for the two hidden local variables (sequence slot and iterator) before calling `addLocal`. Without this check, deeply nested for-loops could overflow the `locals` array, causing a buffer overrun. The fix emits a clear compiler error when `numLocals + 2` exceeds `MAX_LOCALS`, and includes a regression test with 85 nested for-loops that previously triggered the overflow.
This commit is contained in:
@@ -0,0 +1,178 @@
|
||||
// This test caused an array oveflow in local variable array due to hidden
|
||||
// variables of for loop
|
||||
|
||||
// expect error line 91
|
||||
var z = []
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
for (x in z) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user