C ++错误:字符串格式

时间:2012-03-29 11:20:07

标签: c++ warnings

这是我的代码:

void subroutine(const char *message) { printf(message); }

这是我得到的错误:

Error: In function ' ': warning: format not a string literal and no format arguements [-Wformat-security]

这里有什么错误?我无法解决它。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

你应该使用

printf("%s", message);

更长的解释:

printf将其第一个参数视为格式说明符。如果您很幸运且邮件中不包含%sprintf特殊的其他子字符串,则邮件将“按原样”打印。

但如果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)