ChaiScript/unittests/assign_no_aliasing.chai
leftibot 07d62aae99
Fix #635: Segfault in async result via dangling pointer from optimized for loop (#671)
* Fix #635: Segfault in async result via dangling pointer from optimized for loop


* The optimized for loop (chaiscript_optimizer.hpp) stored the loop
   counter as a stack-local `int` and exposed it to ChaiScript via
   `var(&i)`, creating a reference-type Boxed_Value pointing to the
   stack frame.
2026-04-12 16:47:06 -06:00

42 lines
926 B
ChaiScript

// Issue #635: optimized for loop with := must not produce dangling values
// := is reference-assign, so ret aliases i and sees the loop exit value
// Basic: capture loop variable via :=
var ret = 0
for (var i = 0; i < 100; ++i) {
ret := i
}
assert_equal(100, ret)
// Return from function containing optimized for loop
def loop_result() {
var ret = 0
for (var i = 0; i < 200; ++i) {
ret := i
}
return ret
}
assert_equal(200, loop_result())
// Multiple calls return consistent results
assert_equal(loop_result(), loop_result())
// Nested optimized for loops
var outer_val = 0
var inner_val = 0
for (var i = 0; i < 10; ++i) {
for (var j = 0; j < 10; ++j) {
inner_val := j
}
outer_val := i
}
assert_equal(10, outer_val)
assert_equal(10, inner_val)
// Value-assign (=) captures last body-iteration value, not exit value
var ret2 = 0
for (var i = 0; i < 100; ++i) {
ret2 = i
}
assert_equal(99, ret2)