https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62249
Bug ID: 62249 Summary: Spurious FORTIFY_SOURCE warning with -flto, poll Product: gcc Version: 4.9.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: lto Assignee: unassigned at gcc dot gnu.org Reporter: zackw at panix dot com Created attachment 33388 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33388&action=edit test case (compile on recent glibc system) Compile the attached program on a recent-glibc system with -D_FORTIFY_SOURCE=2 -O2 -flto and you get a spurious warning: $ gcc -flto -O2 -D_FORTIFY_SOURCE=2 test.c In function ‘__poll_alias’, inlined from ‘main’ at test.c:17:9: /usr/include/x86_64-linux-gnu/bits/poll2.h:41:2: warning: call to ‘__poll_chk_warn’ declared with attribute warning: poll called with fds buffer too small file nfds entries return __poll_chk (__fds, __nfds, __timeout, __bos (__fds)); $ gcc -fwhole-program -O2 -D_FORTIFY_SOURCE=2 test.c $ Inspection of bits/poll2.h leads me to believe that the glibc folks expect this construct ... __fortify_function int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout) { if (__bos (__fds) != (__SIZE_TYPE__) -1) { if (! __builtin_constant_p (__nfds)) return __poll_chk (__fds, __nfds, __timeout, __bos (__fds)); else if (__bos (__fds) / sizeof (*__fds) < __nfds) return __poll_chk_warn (__fds, __nfds, __timeout, __bos (__fds)); } return __poll_alias (__fds, __nfds, __timeout); } ... to have the dead arm of the inner 'if' eliminated (one of them must be dead, because the condition is a call to __builtin_constant_p) before warnings are issued.