http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55513
Bug #: 55513 Summary: Incorrect snprintf folding when building with -std=c++0x Classification: Unclassified Product: gcc Version: 4.7.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: gno...@hotmail.com Using the following program: #include <cstdio> #include <iostream> int main() { char str[10]; const int strLength = snprintf(str, sizeof(str), "Hello"); std::cout << strLength << ':' << str << std::endl; return 0; } When built with the following command: g++ test_snprintf.cc -O0 -g3 -std=c++0x The output of running it is: 5: instead of: 5: Hello The program will work fine if either of the following changes are made 1. -std=c++0x is removed from the build command line. 2. The const is removed from the definition of the variable strLength Here's a disassembly of main() up until the call to ostream::operator<<, when built with -std=c++0x: 0x0000000000400a6c <+0>: push %rbp 0x0000000000400a6d <+1>: mov %rsp,%rbp 0x0000000000400a70 <+4>: sub $0x30,%rsp 0x0000000000400a74 <+8>: mov %fs:0x28,%rax 0x0000000000400a7d <+17>: mov %rax,-0x8(%rbp) 0x0000000000400a81 <+21>: xor %eax,%eax 0x0000000000400a83 <+23>: movl $0x5,-0x24(%rbp) 0x0000000000400a8a <+30>: mov $0x5,%esi 0x0000000000400a8f <+35>: mov $0x6010a0,%edi 0x0000000000400a94 <+40>: callq 0x4008a0 <_ZNSolsEi@plt> 0x0000000000400a99 <+45>: mov $0x3a,%esi 0x0000000000400a9e <+50>: mov %rax,%rdi 0x0000000000400aa1 <+53>: callq 0x4008e0 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c@plt> Here's a disassembly of main() up until the call to ostream::operator<<, when built without -std=c++0x _or_ when the const is removed (same result): 0x0000000000400a6c <+0>: push %rbp 0x0000000000400a6d <+1>: mov %rsp,%rbp 0x0000000000400a70 <+4>: sub $0x30,%rsp 0x0000000000400a74 <+8>: mov %fs:0x28,%rax 0x0000000000400a7d <+17>: mov %rax,-0x8(%rbp) 0x0000000000400a81 <+21>: xor %eax,%eax 0x0000000000400a83 <+23>: lea -0x20(%rbp),%rax 0x0000000000400a87 <+27>: movl $0x6c6c6548,(%rax) 0x0000000000400a8d <+33>: movw $0x6f,0x4(%rax) 0x0000000000400a93 <+39>: movl $0x5,-0x24(%rbp) 0x0000000000400a9a <+46>: mov -0x24(%rbp),%eax 0x0000000000400a9d <+49>: mov %eax,%esi 0x0000000000400a9f <+51>: mov $0x6010a0,%edi 0x0000000000400aa4 <+56>: callq 0x4008a0 <_ZNSolsEi@plt> 0x0000000000400aa9 <+61>: mov $0x3a,%esi 0x0000000000400aae <+66>: mov %rax,%rdi 0x0000000000400ab1 <+69>: callq 0x4008e0 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c@plt> OS Version: Ubuntu 12.10 uname -a output: Linux desktop 3.5.0-18-generic #29-Ubuntu SMP Fri Oct 19 10:26:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux gcc --version output: gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2