[cfe-dev] warning for passing NULL as format arg
Matthew Fernandez via cfe-dev
cfe-dev at lists.llvm.org
Tue Apr 9 20:56:14 PDT 2019
Ah perfect. I was not aware of this attribute; thanks for the pointer!
I think the correct solution is not to teach Clang special behaviour for builtins but for their prototypes in the libc headers to include _Nonnull.
> On Apr 9, 2019, at 06:43, Nico Weber <thakis at chromium.org> wrote:
>
> There's _Nonnull (https://clang.llvm.org/docs/AttributeReference.html#nonnull <https://clang.llvm.org/docs/AttributeReference.html#nonnull>) which doesn't allow the optimizer to allow make assumptions based on the presence of the attribute.
>
> Erik is probably saying that you could change clang to act as if this attribute is present on some functions even if it isn't.
>
> On Mon, Apr 8, 2019 at 10:27 PM Matthew Fernandez via cfe-dev <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
> Thanks for the reply, Erik. It didn’t occur to me that Clang might be treating this differently as a builtin. Even so, -Wnonnull would only complain if printf was tagged with __attribute__((nonnull(1))) (which it isn’t on my system), right?
>
> I confess, I’ve never really understood how to use __attribute__((nonnull)) and it has always seemed harmful to me. When Clang or GCC see a nonnull-tagged prototype for a function, they liberally remove null checks within the function body, making it difficult to code defensively. E.g.
>
> int foo(int *p) __attribute__((nonnull));
> int foo(int *p) {
> assert(p != NULL); // <- this will get dropped on anything > -O0
> return *p;
> }
>
> Effectively, compilers treat nonnull as both a warning guide and an optimisation hint. I can get the second effect in isolation with something like __builtin_assume(p != NULL), but I don’t know how to isolate the first effect. I realise this is a bit off into the weeds now, but if you have any thoughts on this topic I’d be interested to hear them.
>
> > On Apr 8, 2019, at 16:53, Erik Pilkington <erik.pilkington at gmail.com <mailto:erik.pilkington at gmail.com>> wrote:
> >
> > Hi Matt,
> >
> > Emitting something like -Wnonnull on builtins that require non-null arguments seems totally reasonable to me, there are probably other builtins where this is a more plausible mistake to make. If you're interested in implementing this, there are some similar diagnostics in SemaChecking.cpp, which would be a good starting point.
> >
> > Erik
> >
> > On 4/6/19 1:57 PM, Matthew Fernandez via cfe-dev wrote:
> >> Hello cfe-dev,
> >>
> >> I came across some surprising behavior involving -Wformat. I was generating some C code and an error in the code generator led to it emitting something similar to the following:
> >>
> >> printf(NULL, “foo”);
> >>
> >> Using Clang on macOS (version “Apple LLVM version 10.0.0 (clang-1000.11.45.5)”) this compiles warning-free even with -Wformat -Wformat-nonliteral -Wformat-zero-length. Is this to be expected? Obviously it’s quite unlikely a human would write this code, but I was surprised the compiler had nothing to say about this.
> >>
> >> Thanks,
> >> Matt
> >> _______________________________________________
> >> cfe-dev mailing list
> >> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
> >> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev <https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev>
> >
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev <https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20190409/5bc472cd/attachment.html>
More information about the cfe-dev
mailing list