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 <b...@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.
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to