这是我的代码:
void subroutine(const char *message) { printf(message); }
这是我得到的错误:
Error: In function ' ': warning: format not a string literal and no format arguements [-Wformat-security]
这里有什么错误?我无法解决它。
有什么建议吗?
答案 0 :(得分:3)
你应该使用
printf("%s", message);
更长的解释:
printf
将其第一个参数视为格式说明符。如果您很幸运且邮件中不包含%s
或printf
特殊的其他子字符串,则邮件将“按原样”打印。
但如果message
包含类似的内容,您的程序将尝试将printf
的其他参数解释为参数。因为没有实际的参数,所以它会将一些任意的内存位置视为指针,并尝试取消引用它。这在最好的情况下会导致崩溃;在最坏的情况下,这可能会泄漏一些敏感数据。
(如果在格式字符串中遇到printf
,%n
甚至可以覆盖某些内存。)
答案 1 :(得分:1)
你可以通过
来解决它 printf("%s", message);
或使用其他内容,例如fputs()而不是printf。
gcc警告你,因为它不知道你提供给printf的格式字符串,因此无法验证参数。
想象一下,你将你的功能称为
message("It's 100%s");
最终成为printf("It's 100%s");
,这是错误的并且最终会导致未定义的行为,因为格式字符串包含%s
,并且您需要为printf提供一个额外的参数,这是一个字符串.. < / p>
答案 2 :(得分:0)
如果您将"%d"
传递给subroutine
,那么您将遇到大麻烦,因为printf
会寻找另一个参数。
编译器会警告您,如果message
包含格式规范,程序可能会崩溃。
如果您打算编写类似
的内容,可以使用vprintf
void subroutine(const char *message, ...)
{
va_list args;
va_start(args, format);
vprintf(message, args);
va_end(args);
}
但如果您只想展示message
,请使用puts(message)
或printf("%s", message)
。