[Bug middle-end/66661] incorrect memory access in optimization with flexible array member
fw at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Sep 6 14:24:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66661
Florian Weimer <fw at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |fw at gcc dot gnu.org
--- Comment #11 from Florian Weimer <fw at gcc dot gnu.org> ---
I think this is a GCC bug.
Object sizes do not have to be a multiple of the object alignment. Consider
this example:
#include <stdalign.h>
#include <stdio.h>
#include <stdlib.h>
_Alignas (128) unsigned v0 = 128;
_Alignas (8) unsigned v1 = 8;
_Alignas (8) unsigned v2 = 8;
_Alignas (8) unsigned v3 = 8;
_Alignas (4) unsigned v4 = 4;
_Alignas (4) unsigned v5 = 4;
_Alignas (8) unsigned v6 = 8;
_Alignas (8) unsigned v7 = 8;
_Alignas (8) unsigned v8 = 8;
_Alignas (4) unsigned v9 = 4;
_Alignas (4) unsigned v10 = 4;
static int
cmp(const void *a, const void *b)
{
unsigned *const *a1 = a;
unsigned *const *b1 = b;
if (*a1 < *b1)
return -1;
if (*a1 > *b1)
return 1;
return 0;
}
int
main()
{
unsigned *p[] = {&v1, &v2, &v3, &v4, &v5, &v6, &v7, &v8, &v9, &v10};
qsort (p, 10, sizeof (p[0]), cmp);
for (int i = 0; i < 9; ++i) {
printf ("%d: alignment %u, size %zd\n",
i, *p[i], (p[i + 1] - p[i]) * sizeof (*p[i]));
}
}
With gcc-5.3.1-6.fc23.x86_64, it prints this for me:
0: alignment 4, size 4
1: alignment 4, size 4
2: alignment 8, size 8
3: alignment 8, size 8
4: alignment 8, size 4
5: alignment 4, size 4
6: alignment 4, size 8
7: alignment 8, size 8
8: alignment 8, size 8
So the assumption that objects are at least as large as their alignment appears
to be refuted by code generated by GCC.
More information about the Gcc-bugs
mailing list