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

Reply via email to