mirror of
https://git.FreeBSD.org/src.git
synced 2024-10-19 02:29:40 +00:00
cdefs.h: Add back fallback define for __printf0like
The format function printf0 is originally a FreeBSD extension. clang has adopted it as an alias for printf. Starting with gcc 11, gcc doesn't do a NULL pointer check for fmtarg. Instead, it has to be tagged with a nonnull attribute, so this gives us the behavior we want. For earlier gcc and other cmopilers, define it away so do not get false positives for NULL pointers for the err*/warn* family of functions. This also fixes -Wsystem-headers by avoiding print0 entirely. My testing for67d1a1cd9e
didn't test that case, so I introduced a regression. All these compilers need to be considered because __printf0like is used in err.h and stdlib.h. Since it's used in system headers, it has to work on all the compilers we support on FreeBSD, not just the ones that can build FreeBSD itself. __printf0like will likely be deleted in the future, since the proper way to do this is with _Nullable or _Nonnull, but the compiler support for those hasn't been completely evaluated. Noticed by: jhb Fixes:67d1a1cd9e
Sponsored by: Netflix Suggestions by: jhb Differential Revision: https://reviews.freebsd.org/D45836
This commit is contained in:
parent
9a04df0515
commit
0b82dac337
@ -338,9 +338,7 @@
|
||||
|
||||
/*
|
||||
* Compiler-dependent macros to declare that functions take printf-like
|
||||
* or scanf-like arguments. They are null except for versions of gcc
|
||||
* that are known to support the features properly (old versions of gcc-2
|
||||
* didn't permit keeping the keywords out of the application namespace).
|
||||
* or scanf-like arguments.
|
||||
*/
|
||||
#define __printflike(fmtarg, firstvararg) \
|
||||
__attribute__((__format__ (__printf__, fmtarg, firstvararg)))
|
||||
@ -352,8 +350,18 @@
|
||||
#define __strftimelike(fmtarg, firstvararg) \
|
||||
__attribute__((__format__ (__strftime__, fmtarg, firstvararg)))
|
||||
|
||||
#define __printf0like(fmtarg, firstvararg) \
|
||||
__attribute__((__format__ (__printf0__, fmtarg, firstvararg)))
|
||||
/*
|
||||
* Like __printflike, but allows fmtarg to be NULL. FreeBSD invented 'printf0'
|
||||
* for this because older versions of gcc issued warnings for NULL first args.
|
||||
* Clang has always had printf and printf0 as aliases. gcc 11.0 now follows
|
||||
* clang. So now this is an alias for __printflike, or nothing. In the future
|
||||
* _Nullable or _Nonnull will replace this.
|
||||
*/
|
||||
#if defined(__clang__) || __GNUC_PREREQ__(11, 0)
|
||||
#define __printf0like(fmtarg, firstvararg) __printflike(fmtarg, firstvararg)
|
||||
#else
|
||||
#define __printf0like(fmtarg, firstvararg)
|
||||
#endif
|
||||
|
||||
#define __strong_reference(sym,aliassym) \
|
||||
extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym)))
|
||||
|
Loading…
Reference in New Issue
Block a user