mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2026-04-30 19:09:26 +08:00
* 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.
26 lines
582 B
ChaiScript
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())
|
|
}
|