This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/25235] New: byte swapping unreliable in optimized builds
- From: "cdfrey at netdirect dot ca" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 2 Dec 2005 23:30:02 -0000
- Subject: [Bug c++/25235] New: byte swapping unreliable in optimized builds
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
GCC version: g++ -v
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../gcc-4.0.2/configure
--prefix=/home/source5/rootdir-gcc402 --enable-languages=c,c++
--enable-concept-checks
Thread model: posix
gcc version 4.0.2
Sample code that reproduces the bug:
#include <iostream>
#include <stdint.h>
// From glibc
#define pa_bswap_64(x) \
((((x) & 0xff00000000000000ull) >> 56) \
| (((x) & 0x00ff000000000000ull) >> 40) \
| (((x) & 0x0000ff0000000000ull) >> 24) \
| (((x) & 0x000000ff00000000ull) >> 8) \
| (((x) & 0x00000000ff000000ull) << 8) \
| (((x) & 0x0000000000ff0000ull) << 24) \
| (((x) & 0x000000000000ff00ull) << 40) \
| (((x) & 0x00000000000000ffull) << 56))
int main()
{
double d = 42.42;
uint64_t conv = *((uint64_t*) &d);
conv = pa_bswap_64(conv);
uint64_t back = pa_bswap_64(conv);
double d2 = *((double*)&back);
std::cout
<< "d = " << d << " d2 = " << d2 << std::endl
<< "conv = " << conv << " back = " << back << std::endl;
}
When compiled without optimization, I get:
source5@cube tmp $ /home/source5/rootdir-gcc402/bin/g++ -Wall -o swap swap.cc
source5@cube tmp $ ./swap
d = 42.42 d2 = 42.42
conv = 17737528904907048256 back = 4631166901565532406
When compiled with optimization, I get:
source5@cube tmp $ /home/source5/rootdir-gcc402/bin/g++ -Wall -O2 -o swap
swap.cc
source5@cube tmp $ ./swap
d = 42.42 d2 = 10.3501
conv = 17626847325199074312 back = 577737629976797172
--
Summary: byte swapping unreliable in optimized builds
Product: gcc
Version: 4.0.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: cdfrey at netdirect dot ca
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25235