[Bug c++/81884] New: Invalid code generation with zero size arrays or flexible array members
v at vsamko dot com
gcc-bugzilla@gcc.gnu.org
Fri Aug 18 11:27:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81884
Bug ID: 81884
Summary: Invalid code generation with zero size arrays or
flexible array members
Product: gcc
Version: 7.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: v at vsamko dot com
Target Milestone: ---
Code below prints
1 2 13 14
BUG DETECTED
when compiled with "-Wfatal-errors -O3 bug2.cpp -o bug2 --save-temps -Wall",
but outputs correct results when compiled with -O0, or if we comment out "
x->eventTime = value_t(10);", or typedef "value_t" to uint64_t.
Same problem if we use flexible array member (e.g. "uint64_t arr[]") instead of
the zero length array.
===
typedef unsigned long uint64_t;
struct value_t {
uint64_t _count;
value_t(uint64_t c) : _count(c) {}
};
struct X {
value_t eventTime;
uint64_t arr[0];
};
X* x;
__attribute__((noclone, noinline))
void initialize() {
x->arr[0] = 11;
x->arr[1] = 12;
x->eventTime = value_t(10);
x->arr[2] = 13;
x->arr[3] = 14;
}
int main() {
char buffer[sizeof(X) + sizeof(uint64_t)*4];
x = (X*)buffer;
x->eventTime = value_t(999);
x->arr[0] = 1;
x->arr[1] = 2;
x->arr[2] = 3;
x->arr[3] = 4;
initialize();
__builtin_printf("%lu %lu %lu %lu\n", x->arr[0], x->arr[1], x->arr[2],
x->arr[3]);
if (x->arr[0] != 11 || x->arr[1] != 12 || x->arr[2] != 13 || x->arr[3] !=
14) {
__builtin_printf("BUG DETECTED\n");
}
else {
__builtin_printf("NO BUG\n");
}
}
More information about the Gcc-bugs
mailing list