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
Le Tue, Jun 20, 2023 at 05:34:19PM +0200, Roland Illig a écrit :
> 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;
> }
OK, thanks!
> ~~~
>
> 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.
I think this is due to the definition of __sysloglike in cdefs.h: it is
in fact an alias to __printflike if __syslog_attribute__ is not defined.
--
Thierry Laronde <tlaronde +AT+ polynum +dot+ com>
http://www.kergis.com/
http://kertex.kergis.com/
Key fingerprint = 0FF7 E906 FBAF FE95 FD89 250D 52B1 AE95 6006 F40C
Home |
Main Index |
Thread Index |
Old Index