[Bug c/78673] New: sprintf missing attribute nonnull on destination argument
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sun Dec 4 18:23:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78673
Bug ID: 78673
Summary: sprintf missing attribute nonnull on destination
argument
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
Thew first argument of the sprintf function designates the destination into
which the function writes the formatted output followed a terminating nul
character. Thus the argument must be a non-null pointer. The declarations of
GCC sprintf built-ins (sprintf, vsprintf, and their checking counterparts) are
missing attribute nonnull on their first argument. The test case below shows
that the built-ins do have the attribute on the format argument (hence the
-Wnonnull warning). It also shows that the -Wformat-length option duplicates
the warning in the null pointer constant cases.
$ cat a.c && gcc -S -Wall -Wextra -Wpedantic a.c
void f0 (char *d)
{
__builtin_sprintf (d, (char*)0);
}
void f1 (void)
{
__builtin_sprintf ((char*)0, "%i", 1); // missing warning
}
void f2 (char *d, __builtin_va_list va)
{
__builtin_vsprintf (d, (char*)0, va);
}
void f3 (__builtin_va_list va)
{
__builtin_vsprintf ((char*)0, "%i", va); // missing warning
}
void f4 (char *d, unsigned n)
{
__builtin___sprintf_chk (d, 0, n, (char*)0);
}
void f5 (unsigned n)
{
__builtin___sprintf_chk ((char*)0, 0, n, "%i", 1); // missing warning
}
void f6 (char *d, unsigned n, __builtin_va_list va)
{
__builtin___vsprintf_chk (d, 0, n, (char*)0, va);
}
void f7 (unsigned n, __builtin_va_list va)
{
__builtin___vsprintf_chk ((char*)0, 0, n, "%i", va); // missing warning
}
a.c: In function ‘f0’:
a.c:3:3: warning: null argument where non-null required (argument 2)
[-Wnonnull]
__builtin_sprintf (d, (char*)0);
^~~~~~~~~~~~~~~~~
a.c: In function ‘f2’:
a.c:13:3: warning: null argument where non-null required (argument 2)
[-Wnonnul]
__builtin_vsprintf (d, (char*)0, va);
^~~~~~~~~~~~~~~~~~
a.c:13:3: warning: too many arguments for format [-Wformat-extra-args]
a.c: In function ‘f4’:
a.c:23:3: warning: null argument where non-null required (argument 4)
[-Wnonnul]
__builtin___sprintf_chk (d, 0, n, (char*)0);
^~~~~~~~~~~~~~~~~~~~~~~
a.c: In function ‘f6’:
a.c:33:3: warning: null argument where non-null required (argument 4)
[-Wnonnul]
__builtin___vsprintf_chk (d, 0, n, (char*)0, va);
^~~~~~~~~~~~~~~~~~~~~~~~
a.c:33:3: warning: too many arguments for format [-Wformat-extra-args]
a.c: In function ‘f0’:
a.c:1:6: warning: null format string [-Wformat-length=]
void f0 (char *d)
^~
a.c: In function ‘f2’:
a.c:11:6: warning: null format string [-Wformat-length=]
void f2 (char *d, __builtin_va_list va)
^~
a.c: In function ‘f4’:
a.c:21:6: warning: null format string [-Wformat-length=]
void f4 (char *d, unsigned n)
^~
a.c: In function ‘f6’:
a.c:31:6: warning: null format string [-Wformat-length=]
void f6 (char *d, unsigned n, __builtin_va_list va)
^~
More information about the Gcc-bugs
mailing list