A problem with alloca()

Sean Kelly sean at invisibleduck.org
Thu Jul 17 11:06:16 PDT 2008


bearophile wrote:
> This exact code (coming from a not nice debugging session):
> 
> import std.c.stdlib: alloca;
> void main() {
>     const int n = 8;
>     for (int i; i < 2; i++)
>         printf("%p\n", alloca(n));
> }
> 
> Prints me two times the same address, is this a bug of Phobos/DMD, or am I doing something wrong?
> 
> If I remove the const from n, it prints two different addresses, correctly:
> 
> import std.c.stdlib: alloca;
> void main() {
>     int n = 8;
>     for (int i; i < 2; i++)
>         printf("%p\n", alloca(n));
> }
> 
> I have tested it with DMD 1.029 and 1.033.

Dunno, but this sounds like a compiler bug to me.

> -------------------
> 
> This is unrelated.
> The following code seems to work on Linux, while with DMD on Win it faults after printing "one".
> But if I use the "phobos hack" (not adding -g in the compilation phase) it works correctly on Win too:
> 
> import std.c.stdio: puts;
> alias int[16] jmp_buf; // int[16] comes from MinGW
> extern (C) int setjmp(jmp_buf env);
> extern (C) void longjmp(jmp_buf env, int value);
> jmp_buf jmpbuf;
> void func() {
>     longjmp(jmpbuf, 1);
> }
> void main() {
>     if (!setjmp(jmpbuf)) {
>         puts("one");
>         func();
>     } else {
>         puts("two");
>     }
> }

setjmp and longjmp with DMD/Win32 are broken.  I had no idea it was 
possible to get these working at all.


Sean


More information about the Digitalmars-d-learn mailing list