<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Apr 28, 2014 at 1:05 PM, Reid Kleckner <span dir="ltr"><<a href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Even if we commit this workaround, can we report this as a bug to upstream Linux?</div></blockquote><div><br></div><div>As mentioned above, I'm guessing Linux probably doesn't want to depend on C standard headers, so they wouldn't see this as a bug in Linux.</div>
<div><br></div><div>You could say that it's a bug in glibc that they include headers that pull in Linux's internal linux/stddef.h in glibc headers used by applications, but based on previous interactions with glibc I would guess that their reply would be "we do include this internal linux header, but we're careful to define __need_NULL and re-include stddef.h to fix the issues caused by that". (I'm happy to file a bug like this if you think it has a chance of not being WontFixed immediately.)</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">  The test case you have shows how this definition of NULL is broken on x86_64, even in C with gcc:</div>
</blockquote><div><br></div><div>The Linux header does</div><div><br></div><div>#if c++</div><div>#define NULL 0</div><div>#else</div><div>#define NULL (void*)0</div><div>#endif</div><div><br></div><div>so that should be fine (?)</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><pre style>$ cat t.c
#define NULL 0
int printf(const char *, ...);
int main() {
  printf("%d %d %d %d %d %d %p\n", 1, 2, 3, 4, 5, 6, 0xdeadbeefdeadbeefULL);
  printf("%d %d %d %d %d %d %p\n", 1, 2, 3, 4, 5, 6, NULL);
}

$ gcc -w t.c -o t && ./t
1 2 3 4 5 6 0xdeadbeefdeadbeef
1 2 3 4 5 6 0xdeadbeef00000000</pre></div></div><div class="gmail_extra"><br><br><div class="gmail_quote"><div><div class="h5">On Sun, Apr 27, 2014 at 2:50 PM, Nico Weber <span dir="ltr"><<a href="mailto:thakis@chromium.org" target="_blank">thakis@chromium.org</a>></span> wrote:<br>

</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">Hi,<br>
<br>
linux/stddef.h does something like<br>
<br>
#undef NULL<br>
#define NULL 0<br>
<br>
when included for C++ translation units, and by transitivity it ends<br>
up being pulled in often on linux (see llvm bug for examples).<br>
-Wsentinel doesn't allow 0 as sentinel, leading to warnings such as<br>
<br>
small.cc:6:18: error: missing sentinel in function call [-Werror,-Wsentinel]<br>
  foo("bar", NULL);<br>
                 ^<br>
                 , NULL<br>
<br>
<br>
To "fix" this, files defines __need_NULL and re-include stddef.h,<br>
assuming that stddef.h redefines NULL if __need_NULL is defined<br>
(similar to the __need_wint_t code that's already there). The attached<br>
patch teaches clang's stddef.h about __need_NULL. (As far as I<br>
understand, this shouldn't interfere with modules – linux/stddef.h<br>
interferes with that, but it does so independently of this patch.)<br>
<br>
Fixes PR12997. Patch mostly by Lei Zhang <<a href="mailto:thestig@chromium.org" target="_blank">thestig@chromium.org</a>>, test<br>
and tweaks by me.<br>
<span><font color="#888888"><br>
Nico<br>
</font></span><br></div></div><div class="">_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br></div></blockquote></div><br></div>
</blockquote></div><br></div></div>