My OS and compiler information as follows:
[root][~]# uname -a
Linux debian 2.6.26-1-686 #1 SMP Sat Jan 10 18:29:31 UTC 2009 i686 GNU/Linux
[root][~]# gcc --version
gcc (Debian 4.3.2-1.1) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.

A test C code with inline assembly language as follows:
  1 #include <stdio.h>
  2
  3 int main()
  4 {
  5     char src[30] = {"This is a test message.\n"};
  6     char dst[30];
  7     int len = 25;
  8
  9     __asm__ __volatile__(
 10         "cld\n\t"
 11         "rep movsb"
 12         :
 13         : "S"(src), "D"(dst), "c"(len)
 14         );
 15     printf("%s\t%d\n", dst, len);
 16     return 0;
 17 }

compile the code like this:
[root][~]# gcc -O2 -o bugtest bugtest.c

then run the program, this issue will be re-produced.

I disassembled the binary and found that, when add O2 switch, before the
printf() function invoked, the edi register will be push into the stack instead
of the address of output. So actually, the output of printf is part of the
dst's tail and all the src, not the dst string.
But if did not set O2 switch, this issue will be disappeared.
So I think this is an excessive optimization issue of gcc.
Thank you!


-- 
           Summary: Excessive optimization issue
           Product: gcc
           Version: 4.3.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: casmyu at gmail dot com
 GCC build triplet: gcc (Debian 4.3.2-1.1) 4.3.2
  GCC host triplet: Debian 5.0
GCC target triplet: Debian 5.0


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39403

Reply via email to