[Bug c/54188] New: Inconsistent __alignof__(long long)
Keith.S.Thompson at gmail dot com
gcc-bugzilla@gcc.gnu.org
Mon Aug 6 09:32:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54188
Bug #: 54188
Summary: Inconsistent __alignof__(long long)
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: minor
Priority: P3
Component: c
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: Keith.S.Thompson@gmail.com
The __alignof__ operator applied to a struct type with a single long
long member yields 4. This is inconsistent; a struct's alignment
should be at least as large as the alignment of any of its members.
I'm using gcc 4.7.0 on Ubuntu 12.04 x86.
gcc -v says:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.7/lto-wrapper
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro
4.7.0-7ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs
--enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.7 --enable-shared --enable-linker-build-id
--with-system-zlib --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7
--libdir=/usr/lib --enable-nls --disable-bootstrap --with-sysroot=/
--enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes
--enable-gnu-unique-object --enable-plugin --enable-objc-gc
--enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic
--enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu
--target=i686-linux-gnu
Thread model: posix
gcc version 4.7.0 (Ubuntu/Linaro 4.7.0-7ubuntu3)
Demo program (alignof_bug.c):
========================================
#include <stdio.h>
#include <stddef.h>
/*
* See <http://stackoverflow.com/q/11825081/827263>,
* posted by PiotrNycz
*/
/*
* The ALIGNOF macro yields the alignment in bytes of a given type,
* determined by how the compiler aligns a member of the type in
* a struct following a single char member.
*/
#define ALIGNOF(type) ((int)(offsetof(struct {char c; type t;}, t)))
struct wrapper {
long long ll;
};
int main(void) {
printf("__alignof__(long long) = %d\n",
(int)__alignof__(long long));
printf("__alignof__(struct wrapper) = %d\n",
(int)__alignof__(struct wrapper));
printf("ALIGNOF(long long) = %d\n",
(int)ALIGNOF(long long));
printf("ALIGNOF(struct wrapper) = %d\n",
(int)ALIGNOF(struct wrapper));
if (__alignof__(long long) > __alignof__(struct wrapper)) {
puts("Inconsistent __alignof__, long long vs. struct");
}
if (__alignof__(long long) != ALIGNOF(long long)) {
puts("Inconsistent alignment for long long");
}
return 0;
}
========================================
Output:
========================================
__alignof__(long long) = 8
__alignof__(struct wrapper) = 4
ALIGNOF(long long) = 4
ALIGNOF(struct wrapper) = 4
Inconsistent __alignof__, long long vs. struct
Inconsistent alignment for long long
========================================
A response to
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10360
suggests that __alignof__ needn't necessarily yield the same result
as the offset of a member within a struct. I'm not sure I agree
with that, but the main problem I'm reporting here refers to the
alignment of the struct type itself, compared to the alignment of
one of its members.
More information about the Gcc-bugs
mailing list