Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 27 Mar 2015 09:31:02 -0500
From:      Pedro Giffuni <pfg@FreeBSD.org>
To:        Bruce Evans <brde@optusnet.com.au>, Tijl Coosemans <tijl@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, gerald@freebsd.org
Subject:   Re: svn commit: r280636 - head/include
Message-ID:  <551569A6.9010601@FreeBSD.org>
In-Reply-To: <20150327214341.E2629@besplex.bde.org>
References:  <201503252153.t2PLrInc025854@svn.freebsd.org> <20150326130403.W993@besplex.bde.org> <551376D4.4030003@FreeBSD.org> <20150326170535.U2239@besplex.bde.org> <20150326142052.6789dd50@kalimero.tijl.coosemans.org> <20150327214341.E2629@besplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help


On 03/27/15 06:01, Bruce Evans wrote:
> On Thu, 26 Mar 2015, Tijl Coosemans wrote:
>
>> On Thu, 26 Mar 2015 17:37:53 +1100 (EST) Bruce Evans 
>> <brde@optusnet.com.au> wrote:
>>> On Wed, 25 Mar 2015, Pedro Giffuni wrote:
>>>> On 03/25/15 21:14, Bruce Evans wrote:
>>>>> On Wed, 25 Mar 2015, Pedro F. Giffuni wrote:
>>>>>> Log:
>>>>>>  Temporarily revert 280458.
>>>>>>
>>>>>>  GCC is still carries an old version of cdefs.h which doesn't
>>>>>>  accept multiple parameters for the nonnull attribute.
>>>>>>  Since this issue probably affects many ports in the tree
>>>>>>  we will revert it for now until gcc gets fixed.
>>>>>
>>>>> Note that sys/cdefs.h is supposed to work with any version of
>>>>> gcc back to gcc-1, and does mostly work back to at least gcc-2.95.
>>>>> The whole point of sys/cdefs.h is to provide compatibity macros
>>>>> for old and other non-default compilers.  Standard compilers don't
>>>>> even have __attribute__(()).  So no changes in future versions
>>>>> of gcc will fix the previous commit.
>>>>
>>>> cdefs.h still works for all versions of gcc back to gcc-1 AFAICT.
>>>
>>> I now remember other bugs in it.  I think you put the varargs stuff
>>> in the non-gcc version.  That won't work compilers that don't support
>>> varargs for macros.  Neither will not changing the non-gcc version.
>
> I confirmed the complete brokenness of the varargs stuff for the
> non-C99 case.
>

Hmm ... disabling existing compiler features to get a -Wall error
doesn't qualify as complete brokenness. since gcc 2.95 C99 supports
vararg macros we are basically talking about support for gcc 2.8 here.


>>> 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().  ...
>>
>> 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);
>
> Good idea.  There aren't many functions that accept null for some
> pointer args but not others.
>
> The multiple __nonnull() method is already used a lot.  E.g., in
> sys/systm.h it is used 11 times.  systm.h also gives many examples
> where __nonnull_all cannot be used.  It cannot be used for the
> strto* family because endptr can be null, or for the copyinstr()
> family for similar reasons (a value may be returned indirectly
> but the pointer for this is null if this value is not needed).
>

This would become very long for some of the functions in pthread.h.
I can accept reverting the variadic macro merge in 10-stable but I
really think FreeBSD 11 has to move on.

Pedro.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?551569A6.9010601>