tech-toolchain archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: WARNS > 3 then -Wformat=2: pb with va_list
Am 20.06.2023 um 15:45 schrieb tlaronde%polynum.com@localhost:
Is there a way to please the compiler when using a va_list and calling
syslog(3) or fprintf(3)?
When you forward to syslog, you have to call vsyslog(3), not syslog(3).
~~~c
#include <stdarg.h>
#include <stdio.h>
#include <syslog.h>
static void __sysloglike(2, 3)
my_syslog(int prio, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fprintf(stderr, "\n");
va_start(ap, fmt);
vsyslog(prio, fmt, ap);
va_end(ap);
}
int
main(int argc, char **argv)
{
my_syslog(1, "%d", 4);
my_syslog(2, "%.*s", 5, "hello, world");
return 0;
}
~~~
When you change the 'vsyslog' to plain 'syslog', you get:
sl.c:16:2: error: format not a string literal,
argument types not checked [-Werror=format-nonliteral]
This error message is highly confusing, it should rather say that
'syslog' takes varargs, not a 'va_list'.
Curiously, GCC 10 doesn't complain when I pass a __sysloglike string to
a printf-like function, and vice versa.
Roland
Home |
Main Index |
Thread Index |
Old Index