On Tue, May 27, 2014 at 8:32 AM, Patrick Palka <patr...@parcs.ath.cx> wrote: > On Tue, May 27, 2014 at 3:33 AM, Richard Biener > <richard.guent...@gmail.com> wrote: >> On Mon, May 26, 2014 at 9:01 PM, Patrick Palka <patr...@parcs.ath.cx> wrote: >>> Hi, >>> >>> This patch teaches the C++ frontend to warn on NULL checks against >>> inline functions and it teaches the middle-end to fold NULL checks >>> against inline functions. These two things are currently done for >>> non-inline C++ functions, but inline functions are exceptional in that >>> the C++ frontend marks them as weak, and NULL checks against weak >>> symbols cannot be folded in general because the symbol may be mapped to >>> NULL at link-time. >>> >>> But in the case of an inline function, the fact that it's a weak symbol >>> is an implementation detail. And because it is not permitted to >>> explicitly give an inline function the "weak" attribute (see >>> handle_weak_attribute), in order to acheive $SUBJECT it suffices to >>> assume that all inline functions are non-null, which is what this patch >>> does. >>> >>> Bootstrap and regtest against x86_64-unknown-linux-gnu in progress. Is >>> this patch OK assuming no regressions? >> >> What about always_inline function wrappers as used in FORTIFY_SOURCE? >> IIRC the actual referenced function may be declared weak and thus the >> address can compare to NULL? Sth like >> >> extern void __foo (void) __attribute__((weak,asm("foo"))); >> extern inline __attribute__((always_inline,gnu_inline)) void foo (void) >> { >> __foo (); >> } >> >> int main() >> { >> if (foo == 0) >> return 0; >> abort (); >> } >> >> The issue is that the inline and alias may be hidden to the user and thus >> he'll get unwanted and confusing warnings. >> >> Richard. > > So as it stands the foo == 0 check in the above example gets folded > with or without my patch. The issue here seems to be related to the > use of gnu_inline. The address of an inline function marked > gnu_inline shouldn't be considered non-NULL because a standalone > function does not actually get emitted. Of course, one could inspect > aliases but in general it is not correct to assume such functions are > non-NULL. Does this sound right? > > This issue has slight overlap with the issue that my patch tries to > fix. I could try to handle it as well.
Oh, disregard the above. I think I see what you mean now, Richard. Because __foo is an alias for foo, and __foo is weak, is it safe to assume that foo is non-NULL? That is a tricky question...