[Bug 1072650] Re: gcc -O2 produces incorrect code for accessing struct by its address
David
david at edeca.net
Wed Mar 19 09:51:33 UTC 2014
Also see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60581 (reported
upstream to GCC by Rafał) and
https://bugs.gentoo.org/show_bug.cgi?id=505026 (further discussion of
why this has occurred).
** Bug watch added: GCC Bugzilla #60581
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60581
** Bug watch added: Gentoo Bugzilla #505026
https://bugs.gentoo.org/show_bug.cgi?id=505026
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to gcc-defaults in Ubuntu.
https://bugs.launchpad.net/bugs/1072650
Title:
gcc -O2 produces incorrect code for accessing struct by its address
Status in “gcc-defaults” package in Ubuntu:
New
Bug description:
The repro code (attached below), when compiled under Ubuntu 12.04 LTS on x86_64, with -O2 flag, produces incorrect code.
As seen in the disassembly, the assignment to hdr.saddr is completely optimized out, and subsequent accesses to this field reads garbage from the stack.
Without -02, or on x86_32, the code is correct (so on x86_64, the same program compiled with -O2 produces different output than the one compiled without -O2).
At least on one other 64bit system (Fedora 14), gcc -O2 produces correct code. This looks like a gcc bug, specific to the particular version.
Because of this bug, libnids library is not working on x86_64 12.04 LTS (as originally reported by Carlos Vega, carlosvm91 at gmail.com).
========== Repro code =========
#include <stdio.h>
struct psuedo_hdr
{
int saddr;
int daddr;
char zero;
char protocol;
short len;
} __attribute__((packed));
main()
{
unsigned int i;
unsigned int sum = 0;
struct psuedo_hdr hdr;
hdr.saddr = 0xaabbccdd;
hdr.daddr = 0x11223344;
hdr.zero = 0;
hdr.protocol = 6;
hdr.len = 2;
for (i = 0; i < sizeof(hdr); i += 2)
sum += *(short *)((char *)(&hdr) + i);
printf("0x%x\n", sum);
return 0;
}
==== Repro code end ====
==== packages versions ====
user at user-MS-7808:~/gccbug$ dpkg -s gcc binutils
Package: gcc
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 41
Maintainer: Ubuntu Developers <ubuntu-devel-discuss at lists.ubuntu.com>
Architecture: amd64
Source: gcc-defaults (1.112ubuntu5)
Version: 4:4.6.3-1ubuntu5
Provides: c-compiler
Depends: cpp (>= 4:4.6.3-1ubuntu5), gcc-4.6 (>= 4.6.3-1~)
Recommends: libc6-dev | libc-dev
Suggests: gcc-multilib, make, manpages-dev, autoconf, automake1.9, libtool,
flex, bison, gdb, gcc-doc
Conflicts: gcc-doc (<< 1:2.95.3)
Description: GNU C compiler
This is the GNU C compiler, a fairly portable optimizing compiler for C.
.
This is a dependency package providing the default GNU C compiler.
Original-Maintainer: Debian GCC Maintainers <debian-gcc at lists.debian.org>
Package: binutils
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 8564
Maintainer: Ubuntu Core developers <ubuntu-devel-discuss at lists.ubuntu.com>
Architecture: amd64
Version: 2.22-6ubuntu1
Replaces: binutils-gold (<< 2.20.51.20100415)
Provides: elf-binutils
Depends: libc6 (>= 2.14), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.6), zlib1g
(>= 1:1.2.0)
Suggests: binutils-doc (>= 2.22-6ubuntu1)
Conflicts: binutils-gold (<< 2.20.51.20100415), elf-binutils, gas, modutils
(<< 2.4.19-1)
Description: GNU assembler, linker and binary utilities
The programs in this package are used to assemble, link and manipulate
binary and object files. They may be used in conjunction with a compiler
and various libraries to build programs.
Original-Maintainer: Matthias Klose <doko at debian.org>
=== packages version end ====
==== disassembly of code produced with -O2 ====
0000000000400440 <main>:
400440: 48 83 ec 18 sub $0x18,%rsp
400444: 31 d2 xor %edx,%edx
400446: 48 8d 74 24 0c lea 0xc(%rsp),%rsi
40044b: c6 44 24 08 00 movb $0x0,0x8(%rsp)
400450: c6 44 24 09 06 movb $0x6,0x9(%rsp)
400455: 66 c7 44 24 0a 02 00 movw $0x2,0xa(%rsp)
40045c: 48 89 e0 mov %rsp,%rax
40045f: 90 nop
400460: 0f bf 08 movswl (%rax),%ecx
400463: 48 83 c0 02 add $0x2,%rax
400467: 01 ca add %ecx,%edx
400469: 48 39 f0 cmp %rsi,%rax
40046c: 75 f2 jne 400460 <main+0x20>
40046e: be 5c 06 40 00 mov $0x40065c,%esi
400473: bf 01 00 00 00 mov $0x1,%edi
400478: 31 c0 xor %eax,%eax
40047a: e8 b1 ff ff ff callq 400430 <__printf_chk at plt>
40047f: 31 c0 xor %eax,%eax
400481: 48 83 c4 18 add $0x18,%rsp
400485: c3 retq
400486: 90 nop
400487: 90 nop
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1072650/+subscriptions
More information about the foundations-bugs
mailing list