After spending a few hours looking at some code that works fine on Linux but fails with stack/memory corruption on RISC OS, I tracked the problem area down to a situation similar to that described in bug 174 [2]. At a guess I'd say that my issue is the same as the one that Jan is having
with Vala, since it seems like a common enough code sequence for people to encounter.
Basically my code was using a recursive function that sometimes uses alloca() and sometimes doesn't. The fix for bug 174 (judging by the comments in __gcc_alloca_restore in gcc4/recipe/files/gcc/libunixlib/gcccompat/galloca.c) only deals with the situation where the alloca() has been skipped and the chunk list is empty. But in my case my recursive function means that the chunk list is often non-empty when alloca() is skipped, which would lead to __gcc_alloca_restore erroneously deleting the head chunk in the list when any non-alloca() code path exits. The test program I've attached can be
used to demonstrate this behaviour:* 'test 3 1 2' will cause the recursion to go two levels deep, allocating one alloca()'d array at each level. This test works. * 'test 2 1 2' will cause the recursion to go two levels deep, but only allocate a 'test' instance at the second level. This test also works (it would have crashed without the #174 fix) * 'test 1 1 2' will cause the recursion to go two levels deep, but only calls alloca() at the first level. This currently crashes, due to __gcc_alloca_restore misbehaving as the second level exits, and deleting the chunk that the first level relied upon.
The easiest fix is likely to be to amend the NULL check that was added to __gcc_alloca_restore() for bug #174 so that it also returns if
(chunk->block != block). I'd have tested this myself by now, but somethingis preventing my current source tree from building, so I'll have to try again in a day or two when I have some more time available to get my tree
working again. [1] http://www.riscos.info/pipermail/gcc/2010-May/005275.html [2] http://www.riscos.info/cgi-bin/bugzilla3/show_bug.cgi?id=174 Cheers, - Jeffrey
test.cc
Description: Binary data
_______________________________________________ GCCSDK mailing list [email protected] Bugzilla: http://www.riscos.info/bugzilla/index.cgi List Info: http://www.riscos.info/mailman/listinfo/gcc Main Page: http://www.riscos.info/index.php/GCCSDK
