[Bug target/58416] Incorrect x87-based union copying code
ch3root at openwall dot com
gcc-bugzilla@gcc.gnu.org
Thu Jun 9 15:01:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58416
Alexander Cherepanov <ch3root at openwall dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |ch3root at openwall dot com
--- Comment #5 from Alexander Cherepanov <ch3root at openwall dot com> ---
Not sure if it's still the same bug but the pattern from this PR leads to
problems with long double on x86-64. The optimization looses data in bytes
corresponding to padding in long double.
Transformation from a string to a long double is wrong too, filed separately --
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71475. But here this example is
only to illustrate that the padding is lost.
Source code:
----------------------------------------------------------------------
#include <stdio.h>
struct s {
char s[sizeof(long double)];
};
union u {
long double d;
struct s s;
};
int main()
{
union u x = {0};
x.s = (struct s){"xxxxxxxxxxxxxxxx"};
union u y = x;
// start from the big end
for (unsigned char *p = (unsigned char *)&y + sizeof y; p-- > (unsigned char
*)&y;)
printf("%02x ", *p);
puts("");
}
----------------------------------------------------------------------
Results:
----------------------------------------------------------------------
$ gcc -std=c11 -pedantic -Wall -Wextra test.c && ./a.out
78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78
$ gcc -std=c11 -pedantic -Wall -Wextra -O3 test.c && ./a.out
00 00 00 00 00 40 00 00 78 78 78 78 78 78 78 78
----------------------------------------------------------------------
gcc version: gcc (GCC) 7.0.0 20160608 (experimental)
More information about the Gcc-bugs
mailing list