[Bug c++/56394] New: pointer arithmetic breaks with __attribute__((packed))
maxim.yegorushkin at gmail dot com
gcc-bugzilla@gcc.gnu.org
Tue Feb 19 13:57:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56394
Bug #: 56394
Summary: pointer arithmetic breaks with __attribute__((packed))
Classification: Unclassified
Product: gcc
Version: 4.7.2
Status: UNCONFIRMED
Severity: major
Priority: P3
Component: c++
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: maxim.yegorushkin@gmail.com
I stumbled upon strange behaviour of pointer arithmetic when
__attribute__((packed)) is used. Please consider the following:
$ cat test.cc
#include <cstdio>
#include <cstdint>
struct __attribute__((packed)) Xyz {
uint32_t seq_no;
uint64_t end_offset;
};
struct Mapping {
void* mem;
size_t len;
template<class T>
T* begin() {
return static_cast<T*>(mem);
}
template<class T>
T* end() {
auto e = reinterpret_cast<uintptr_t>(static_cast<char*>(mem) +
len);
return reinterpret_cast<T*>(e - e % sizeof(T));
}
};
int main() {
Mapping m{reinterpret_cast<void*>(0x40000u), 0x1000u};
Xyz* beg = m.begin<Xyz>();
Xyz* end = m.end<Xyz>();
size_t len = end - beg;
printf("%p\n", beg);
printf("%p\n", end);
printf("%zx\n", len);
}
$ g++ -o test -std=gnu++11 -Wall -Wextra test.cc
$ ./test
0x40000
0x40ff8
55555555555556aa <---- wrong
If -O optimization switch added the output is correct:
$ g++ -o test -O -std=gnu++11 -Wall -Wextra test.cc
$ ./test
0x40000
0x40ff8
154 <---- correct
When __attribute__((packed)) is removed it also correctly outputs:
$ ./test
0x40000
0x41000
100 <---- correct
I looked at the documentation for __attribute__((packed)) and it says nothing
about it changing the behaviour of pointer arithmetic.
More information about the Gcc-bugs
mailing list