string - Valid printf() statements in C -
given that:
char *message = "hello, world"; char *format = "x=%i\n"; int x = 10;
why printf (message);
invalid (i.e. rejected compiler being potentially insecure) , printf (format, x);
isn't?
is format
treated string literal in case , message
format string? if so, why?
update
know why
printf (message);
rejected. question is, why printf (format, x);
not rejected too. i'm using clang. error message printf (message);
format string not string literal (potentially insecure)
.
it compiles fine under gcc. appear compiler specific , how clang sets warnings.
you can warning in both cases enabling -wformat-nonliteral
option, not included in either -wall
or -wextra
(but is in -weverything
).
for whatever reason, seems intentional design decision emit security warning when non-literal printf
statement takes no additional arguments. source code emits warning can found in lib/sema/semachecking.cpp
:
// if there no arguments specified, warn -wformat-security, otherwise // warn -wformat-nonliteral. if (args.size() == firstdataarg) diag(args[format_idx]->getlocstart(), diag::warn_format_nonliteral_noargs) << origformatexpr->getsourcerange(); else diag(args[format_idx]->getlocstart(), diag::warn_format_nonliteral) << origformatexpr->getsourcerange();
i'd guess compatibility existing legacy code, that's pure speculation.
Comments
Post a Comment