The attached code fails with gcc version 4.3.0 20070703 (experimental). It call the alloc() function at each iteration producing a memory corruption. I get the following trace.
grenade-> g++ /tmp/test.C grenade-> ./a.out 2000 *** glibc detected *** ./a.out: double free or corruption (!prev): 0x0000000000502010 *** ======= Backtrace: ========= /lib64/libc.so.6[0x3d64a6d313] /lib64/libc.so.6(__libc_free+0x84)[0x3d64a6d494] ./a.out(__gxx_personality_v0+0x3c0)[0x400c58] ./a.out[0x400e01] ./a.out(__gxx_personality_v0+0x2cf)[0x400b67] /lib64/libc.so.6(__libc_start_main+0xf4)[0x3d64a1c784] ./a.out(_ZNSt8ios_base4InitD1Ev+0x51)[0x400909] ======= Memory map: ======== 00400000-00402000 r-xp 00000000 08:02 6975782 /home/papadop/compiles/Odyssee++-linux-4.3-x86_64/Bins/DirInv/src/Q1Mesh/a.out 00501000-00502000 rw-p 00001000 08:02 6975782 /home/papadop/compiles/Odyssee++-linux-4.3-x86_64/Bins/DirInv/src/Q1Mesh/a.out 00502000-00523000 rw-p 00502000 00:00 0 [heap] 3d63d00000-3d63d1a000 r-xp 00000000 08:02 7292997 /lib64/ld-2.4.so 3d63e19000-3d63e1a000 r--p 00019000 08:02 7292997 /lib64/ld-2.4.so 3d63e1a000-3d63e1b000 rw-p 0001a000 08:02 7292997 /lib64/ld-2.4.so 3d64a00000-3d64b3f000 r-xp 00000000 08:02 7293004 /lib64/libc-2.4.so 3d64b3f000-3d64c3e000 ---p 0013f000 08:02 7293004 /lib64/libc-2.4.so 3d64c3e000-3d64c42000 r--p 0013e000 08:02 7293004 /lib64/libc-2.4.so 3d64c42000-3d64c43000 rw-p 00142000 08:02 7293004 /lib64/libc-2.4.so 3d64c43000-3d64c48000 rw-p 3d64c43000 00:00 0 3d64d00000-3d64d80000 r-xp 00000000 08:02 7293008 /lib64/libm-2.4.so 3d64d80000-3d64e7f000 ---p 00080000 08:02 7293008 /lib64/libm-2.4.so 3d64e7f000-3d64e80000 r--p 0007f000 08:02 7293008 /lib64/libm-2.4.so 3d64e80000-3d64e81000 rw-p 00080000 08:02 7293008 /lib64/libm-2.4.so 2aaaaaaab000-2aaaaaaac000 rw-p 2aaaaaaab000 00:00 0 2aaaaaad2000-2aaaaaad3000 rw-p 2aaaaaad2000 00:00 0 2aaaaaad3000-2aaaaabb8000 r-xp 00000000 08:02 3401368 /usr/local/gcc-4.3/lib64/libstdc++.so.6.0.9 2aaaaabb8000-2aaaaacb8000 ---p 000e5000 08:02 3401368 /usr/local/gcc-4.3/lib64/libstdc++.so.6.0.9 2aaaaacb8000-2aaaaacbf000 r--p 000e5000 08:02 3401368 /usr/local/gcc-4.3/lib64/libstdc++.so.6.0.9 2aaaaacbf000-2aaaaacc1000 rw-p 000ec000 08:02 3401368 /usr/local/gcc-4.3/lib64/libstdc++.so.6.0.9 2aaaaacc1000-2aaaaacd4000 rw-p 2aaaaacc1000 00:00 0 2aaaaacd4000-2aaaaace9000 r-xp 00000000 08:02 3401390 /usr/local/gcc-4.3/lib64/libgcc_s.so.1 2aaaaace9000-2aaaaade8000 ---p 00015000 08:02 3401390 /usr/local/gcc-4.3/lib64/libgcc_s.so.1 2aaaaade8000-2aaaaade9000 rw-p 00014000 08:02 3401390 /usr/local/gcc-4.3/lib64/libgcc_s.so.1 2aaaaade9000-2aaaaadeb000 rw-p 2aaaaade9000 00:00 0 2aaaaae00000-2aaaaae21000 rw-p 2aaaaae00000 00:00 0 2aaaaae21000-2aaaaaf00000 ---p 2aaaaae21000 00:00 0 7fffe7a74000-7fffe7a89000 rw-p 7fffe7a74000 00:00 0 [stack] ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0 [vdso] Abort As it can be seen the allocator has been called 2000 times instead of only 1000. The same code on gcc version 4.3.0 20070528 (experimental) (though on i686-pc-linux-gnu) does not behave the same way... -- Summary: Wrong optimisation Product: gcc Version: 4.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: theodore dot papadopoulo at sophia dot inria dot fr GCC build triplet: x86_64-unknown-linux-gnu GCC host triplet: x86_64-unknown-linux-gnu GCC target triplet: x86_64-unknown-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33025