svn commit: r280636 - head/include
Pedro Giffuni
pfg at FreeBSD.org
Thu Mar 26 14:25:25 UTC 2015
On 03/26/15 08:20, Tijl Coosemans wrote:
> On Thu, 26 Mar 2015 17:37:53 +1100 (EST) Bruce Evans <brde at optusnet.com.au> wrote:
>> --- snip ---
>>
>> glibc (2.6 at least) avoids using varargs in its __nonnull() macro
>> by using the same portable method that is used in many optional
>> debugging statements including FreeBSD's KASSERT(). (KASSERT() is
>> broken as designed. It never needed this since it wasn't implmented
>> until several years after C99 standardized varargs for macros.)
>> The macro takes a single arg consisting of a normal list of args
>> enclosed in parentheses. The extra parentheses are not passed to
>> the __attribute__() list. All invocations of the macro must be
>> ugly to supply the parantheses. The parentheses give a large
>> syntactic difference, so the ugliness cannot be fixed easily by
>> switching to varargs macros. For KASSERT(), there would be about
>> 7500 in /usr/src lines to clean up. For __nonnull(), there would
>> be only about lines 160 in /usr/src to change. Mostly
>> __nonnull(1) -> __nonnull((1)). But __nonnull() is more likely to
>> be (mis)used in ports.
> Maybe introduce a __nonnull_all macro and leave __nonnull varargs-free:
>
> #define __nonnull(x) __attribute__((__nonnull__(x)))
> #define __nonnull_all __attribute__((__nonnull__))
>
> Then in the rare cases where multiple arguments must be nonnull but
> __nonnull_all doesn't apply you can use multiple __nonnull:
>
> int f(void *, void *, void *) __nonnull(1) __nonnull(2);
>
the __all extension takes more space than the extra parenthesis.
I honestly see no reason to cope with pre-C99 compilers. The base
compilers accept the standard varargs fine, for previous compilers
we will ignore non standard varargs and use the null implementation.
>>> The reason why I had to revert the change is actually a systematic
>>> bug in gcc: during it's build process gcc generates a new cdefs.h
>>> from our headers. Attempting to use an older gcc from ports
>>> that was build with the broken mono-parameter __nonnull() ended
>>> up causing breakage in any code using signal.h or pthreads.h.
>> I see. gcc's "fixed" headers cause lots of problems.
> I've complained about this multiple times in the past. The gcc ports
> should not install these "fixed" headers.
Yes it is a gcc bug. And I already forwarded the issue to the gcc
maintainer.
> Pedro, by reverting this commit you only allow this problem to persist,
> so please reapply it. You also shouldn't wait weeks before applying
> the next commit. No amount of waiting is enough. There will always be
> users bitten by it. The problem is in the ports. It needs to be fixed
> there. If you receive any problem reports that are caused by this gcc
> problem, forward them to the gcc port maintainer.
>
There's no good reason not to be nice with our developers.
I will update cdefs with a week anticipation and point them
to update gcc after the header changes. I will MFC the
cdefs updates but not the header changes.
Pedro.
More information about the svn-src-all
mailing list