[Bug c/93910] -Waddress-of-packed-member triggered without actual access to a member or the address of a member
stephane.goujet at wanadoo dot fr
gcc-bugzilla@gcc.gnu.org
Wed Feb 26 12:39:00 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93910
--- Comment #10 from stephane.goujet at wanadoo dot fr ---
(In reply to stephane.goujet from comment #9)
> 2. There are inconsistencies in the Warning:
Another inconsistency:
2.c The documentation of the packed attribute says "This attribute, attached to
a struct, [...] is equivalent to specifying the packed attribute on each of the
members." Well, guess what? Waddress-of-packed-member is triggered when the
attribute is at the struct level, but is not triggered when it is at members
level.
Example code:
---------------------------
# 1 "indiv2.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "indiv2.c"
struct __attribute__((packed)) Sw {
char a;
int b;
};
struct Si {
char a __attribute__((packed));
int b __attribute__((packed));
};
int main(void) {
struct Sw sw;
struct Si si;
int * pw = (int *) &sw;
int * pi = (int *) &si;
return 0;
}
---------------------------
Compilation result (setting aside the Wattributes warning,
Waddress-of-packed-member warns for Sw, not for Si):
---------------------------
~/test/c/gcc9packed $LC_ALL=C gcc -Wextra indiv2.c -o indiv2_gcc -save-temps
indiv2.c:10:2: warning: 'packed' attribute ignored for field of type 'char'
[-Wattributes]
10 | char a __attribute__((packed));
| ^~~~
indiv2.c: In function 'main':
indiv2.c:18:2: warning: converting a packed 'struct Sw' pointer (alignment 1)
to a 'int' pointer (alignment 4) may result in an unaligned pointer value
[-Waddress-of-packed-member]
18 | int * pw = (int *) &sw;
| ^~~
indiv2.c:3:32: note: defined here
3 | struct __attribute__((packed)) Sw {
| ^~
---------------------------
More information about the Gcc-bugs
mailing list