ChaiScript/unittests/async_return_value.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

26 lines
582 B
ChaiScript

// Issue #635: async + optimized for loop must not segfault from dangling pointer
// := is reference-assign, so ret aliases i and sees the loop exit value
var func = fun(){
var ret = 0;
for (var i = 0; i < 1000; ++i) {
ret := i;
}
return ret;
}
var&fut1 = async(func);
var fut2 = async(func);
assert_equal(1000, fut1.get())
assert_equal(1000, fut2.get())
// Multiple concurrent async calls to stress the scenario
var results = []
for (var n = 0; n < 5; ++n) {
results.push_back(async(func))
}
for (var n = 0; n < 5; ++n) {
assert_equal(1000, results[n].get())
}