This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/84275] New: missing warning on conflicting attributes on different declara
- From: "msebor at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Thu, 08 Feb 2018 01:10:25 +0000
- Subject: [Bug middle-end/84275] New: missing warning on conflicting attributes on different declara
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84275
Bug ID: 84275
Summary: missing warning on conflicting attributes on different
declara
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
GCC silently accepts function declarations with attributes whose parameters
contradict or conflict with one another, both on distinct declarations of the
same function and even on the same declaration.
The test case below shows that if two declarations specify such conflicting
attributes GCC honors the first one (at least the object size pass does).
Since the other attribute is ignored GCC should point that out (e.g., by
-Wattributes or by -Wignored-attributes).
Similar bugs were reported in pr32960 and pr81544.
$ cat t.C && gcc -D_FORTIFY_SOURCE=2 -O2 -S -Wall -xc t.C
#include <string.h>
#define ATTR(list) __attribute__ (list)
void* ATTR ((alloc_align (1), alloc_size (2), // this conflicts...
alloc_align (2), alloc_size (1))) // ...with this
foo (int, int);
void* ATTR ((alloc_size (1), alloc_align (2))) // this conflicts...
bar (int, int);
void* ATTR ((alloc_size (2), alloc_align (1))) // ...with this
bar (int, int);
void* foobar (void)
{
void *p = bar (3, 5);
memset (p, 0, 7);
return p;
}
In file included from /usr/include/string.h:635,
from t.C:1:
In function ‘memset’,
inlined from ‘foobar’ at t.C:19:3:
/usr/include/bits/string3.h:90:10: warning: ‘__builtin___memset_chk’ writing 7
bytes into a region of size 3 overflows the destination [-Wstringop-overflow=]
return __builtin___memset_chk (__dest, __ch, __len, __bos0 (__dest));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~