https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61410
Bug ID: 61410
Summary: strcat overwrites destination string when compiling
with optimizations
Product: gcc
Version: 4.7.3
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: fox at ucw dot cz
The following code
#include
#include
int main(void) {
char str[250];
strcpy(str, " ");
str[0] = '_';
strcat(str, ",");
puts(str);
return 0;
}
prints only ",\n" when compiled with gcc-4.7 -O[23]. It should print "_,\n" and
it does so with gcc-4.7 -O[01], gcc-4.4 -O[0123] and gcc-4.8 -O[0123].
The result of gcc-4.7 -v is
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i486-linux-gnu/4.7/lto-wrapper
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro
4.7.3-1ubuntu1~10.04.2' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs
--enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.7 --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls
--enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes
--enable-gnu-unique-object --enable-plugin --with-system-zlib --enable-objc-gc
--enable-targets=all --disable-werror --with-arch-32=i586
--with-multilib-list=m32,m64 --with-tune=generic --enable-checking=release
--build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1~10.04.2)
The disassembly of the code when using gcc-4.7 -O2:
080483a0 :
80483a0: 55 push %ebp
80483a1: 89 e5 mov%esp,%ebp
80483a3: 83 e4 f0and$0xfff0,%esp
80483a6: 81 ec 10 01 00 00 sub$0x110,%esp
80483ac: 65 a1 14 00 00 00 mov%gs:0x14,%eax
80483b2: 89 84 24 0c 01 00 00mov%eax,0x10c(%esp)
80483b9: 31 c0 xor%eax,%eax
80483bb: 8d 44 24 12 lea0x12(%esp),%eax
80483bf: 89 04 24mov%eax,(%esp)
80483c2: 66 c7 44 24 12 2c 00movw $0x2c,0x12(%esp)
80483c9: e8 a2 ff ff ff call 8048370
80483ce: 31 c0 xor%eax,%eax
80483d0: 8b 94 24 0c 01 00 00mov0x10c(%esp),%edx
80483d7: 65 33 15 14 00 00 00xor%gs:0x14,%edx
80483de: 75 02 jne80483e2
80483e0: c9 leave
80483e1: c3 ret
80483e2: e8 79 ff ff ff call 8048360 <__stack_chk_fail@plt>
80483e7: 90 nop
Cheers,
Milan Straka