------- Additional Comments From pinskia at gcc dot gnu dot org 2005-08-19
19:00 -------
It can be confirmed on x86 with:
extern void abort (void);
#undef memcpy
#define memcpy(dst, src, len) \
__builtin___memcpy_chk (dst, src, len, __builtin_object_size (dst, 0))
int
main (void)
{
static const char data[] = { 0, 0x40, 0xe2, 0x01, 0x00, 0x01, 0x80, 0xc0,
0x1d };
const char *s = &data[1];
int natint = data[0];
unsigned long long tmp = 0;
memcpy (&tmp, s, natint ? sizeof(tmp) : 4);
if (sizeof(tmp) > 4 && (tmp>>32) != 0) /* movq generated? */
abort ();
return 0;
}
And here is a testcase for big endian:
extern void abort (void);
#undef memcpy
#define memcpy(dst, src, len) \
__builtin___memcpy_chk (dst, src, len, __builtin_object_size (dst, 0))
int
main (void)
{
static const char data[] = { 0, 0x40, 0xe2, 0x01, 0x00, 0x01, 0x80, 0xc0,
0x1d };
const char *s = &data[1];
int natint = data[0];
unsigned long long tmp = 0;
memcpy (&tmp, s, natint ? sizeof(tmp) : 4);
printf("%llx\n", tmp);
if (sizeof(tmp) > 4 && (tmp &0xFFFFFF) != 0) /* 64bit move generated? */
abort ();
return 0;
}
--
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever Confirmed| |1
GCC target triplet|x86_64-*-linux-gnu |
Last reconfirmed|0000-00-00 00:00:00 |2005-08-19 19:00:31
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23484