When a variable length array is defined in a loop, and its size is
specified with a const variable, gcc -O3 (and -Os) produces a call of
alloca() without specifying the size argument (eax in my case). This
causes stack overflow.

$ cat test.c
int const n = 4096;
void g(int* p);
void f() { for(;;) { int a[n]; g(a); } }

$ gcc -S -O3 -o - test.c
.globl _f
        .def    _f;     .scl    2;      .type   32;     .endef
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %esi
        pushl   %ebx
        subl    $16, %esp
        .p2align 4,,7
        movl    %esp, %ebx
        call    __alloca

$ gcc -v
Using built-in specs.
Target: i686-pc-cygwin
Configured with:
  --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin
  --libexecdir=/usr/lib --datadir=/usr/share --localstatedir=/var
  --sysconfdir=/etc --infodir=/usr/share/info --mandir=/usr/share/man
  --datadir=/usr/share --infodir=/usr/share/info --mandir=/usr/share/man
  -v --with-gmp=/usr --with-mpfr=/usr --enable-bootstrap
  --enable-version-specific-runtime-libs --with-slibdir=/usr/bin
  --libexecdir=/usr/lib --enable-static --enable-shared
  --enable-shared-libgcc --disable-__cxa_atexit --with-gnu-ld
  --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions
  --disable-symvers --enable-libjava --program-suffix=-4
  --enable-libgomp --enable-libssp --enable-libada
  --enable-threads=posix --with-arch=i686 --with-tune=generic
  --enable-libgcj-sublibs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4
  GNATBIND_FOR_TARGET=gnatbind AS=/opt/gcc-tools/bin/as.exe
  AS_FOR_TARGET=/opt/gcc-tools/bin/as.exe LD=/opt/gcc-tools/bin/ld.exe
Thread model: posix
gcc version 4.3.4 20090804 (release) 1 (GCC)

           Summary: VLA in a loop with a const size causes wrong
           Product: gcc
           Version: 4.3.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: k_satoda at f2 dot dion dot ne dot jp


Reply via email to