[Skiboot] [PATCH] libc: Remove NULL check for format argument in snprintf()

Cyril Bur cyril.bur at au1.ibm.com
Thu Jul 14 11:58:52 AEST 2016


libc printf style functions are annotated with __attribute__((format
(printf, x, y))) which causes GCC to perform compile time checks
against these arguments.

As of at least gcc 6.1.1 [(GCC) 6.1.1 20160602] this causes an error
running make check. GCC appears to be guaranteeing that the format
argument won't be NULL and complaining about explicit checks.

In file included from core/test/run-console-log-buf-overrun.c:48:0:
core/test/run-console-log-buf-overrun.c: In function ‘snprintf’:
core/test/../../libc/stdio/snprintf.c:21:19: error: nonnull argument
‘format’compared to NULL [-Werror=nonnull-compare]
if ((buff==NULL) || (format==NULL))
    ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors make:
*** [core/test/Makefile.check:59:core/test/run-console-log-buf-overrun] Error 1

Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
---
I'm not 100% sure this is the fix we want in terms of backwards
compatibility with older compilers, I'm definitely open to other solutions.

As an other aside (from
https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/Common-Function-Attributes.html):
"The compiler always (unless -ffreestanding or -fno-builtin is used)
checks formats for the standard library functions printf, fprintf,
sprintf, scanf, fscanf, sscanf, strftime, vprintf, vfprintf and
vsprintf whenever such warnings are requested (using -Wformat), so
there is no need to modify the header file stdio.h. In C99 mode, the
functions snprintf, vsnprintf, vscanf, vfscanf and vsscanf are also
checked. Except in strictly conforming C standard modes, the X/Open
function strfmon is also checked as are printf_unlocked and
fprintf_unlocked. See Options Controlling C Dialect."

It looks like GCC actually adds those checks automatically and it is
working in skiboot. Those annotations aren't hurting so I don't see
any reason to remove them but it might be worth knowing that removing
them doesn't change anything...

 libc/stdio/snprintf.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libc/stdio/snprintf.c b/libc/stdio/snprintf.c
index cc1cc0f..35b6f86 100644
--- a/libc/stdio/snprintf.c
+++ b/libc/stdio/snprintf.c
@@ -18,7 +18,7 @@ int snprintf(char *buff, size_t size, const char *format, ...)
 	va_list ar;
 	int count;
 
-	if ((buff==NULL) || (format==NULL))
+	if (buff==NULL)
 		return(-1);
 
 	va_start(ar, format);
-- 
2.9.0



More information about the Skiboot mailing list