For the i386 stack probing feature there is a non-standard argument register %eax used for internal __chkstk call. If the code is translate with gcc with optimization level one or less, code is fine. For -O2 and higher, the argument %eax for __chkstk is optimized out.
The following source is a short test-case for this: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> void foo(char *str) { int len = strlen ("ABCDE"); int len2 = len + strlen (str); char *a = (char *) alloca(len); char *b = (char *) alloca(len2*3); memset (a,'x',len-1); a[len-1]=0; memset (b,'y',len2*3-1); b [len2*3-1]=0; printf ("%s %s\n", a, b); } For optimization -O2 the following assembler is produced (I mark the bad code by !): .file "" .section .rdata,"dr" LC0: .ascii "%s %s\12\0" .text .p2align 4,,15 .globl _foo .def _foo; .scl 2; .type 32; .endef _foo: pushq %rbp movq %rsp, %rbp movq %rsi, -16(%rbp) movq %rdi, -8(%rbp) movq %rbx, -24(%rbp) subq $64, %rsp call _strlen subq $32, %rsp ! leal 15(%rax,%rax,2), %ecx leaq 32(%rsp), %rsi movslq %ecx,%rdi call ___chkstk movl $121, %edx leaq 32(%rsp), %rbx leal -1(%rcx), %eax movl $2021161080, (%rsi) movb $0, 4(%rsi) movq %rbx, %rcx movslq %eax,%r8 call _memset leaq LC0(%rip), %rcx movq %rbx, %r8 movq %rsi, %rdx movb $0, -1(%rbx,%rdi) call _printf movq -24(%rbp), %rbx movq -16(%rbp), %rsi movq -8(%rbp), %rdi leave ret .def _strlen; .scl 2; .type 32; .endef .def _memset; .scl 2; .type 32; .endef .def _printf; .scl 2; .type 32; .endef For optimization -O1 correct assembly is produced: .file "" .section .rdata,"dr" LC0: .ascii "%s %s\12\0" .text .globl _foo .def _foo; .scl 2; .type 32; .endef _foo: pushq %rbp movq %rsp, %rbp movq %rbx, -24(%rbp) movq %rsi, -16(%rbp) movq %rdi, -8(%rbp) subq $96, %rsp movq %rcx, %rdi movl $0, %eax movq $-1, %rcx repne scasb notq %rcx leaq 32(%rsp), %rsi leal 12(%rcx,%rcx,2), %ecx movslq %ecx,%rdi leaq 30(%rdi), %rax andq $-16, %rax call ___chkstk leaq 32(%rsp), %rbx movl $2021161080, (%rsi) movb $0, 4(%rsi) subl $1, %ecx movslq %ecx,%r8 movl $121, %edx movq %rbx, %rcx call _memset movb $0, -1(%rbx,%rdi) movq %rbx, %r8 movq %rsi, %rdx leaq LC0(%rip), %rcx call _printf movq -24(%rbp), %rbx movq -16(%rbp), %rsi movq -8(%rbp), %rdi leave ret .def _memset; .scl 2; .type 32; .endef .def _printf; .scl 2; .type 32; .endef -- Summary: Optimization higher or eqaul to -O2 produce wrong code Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: ktietz at gcc dot gnu dot org GCC target triplet: 86_64-pc-mingw32 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36321