更正“格式字符串不是字符串文字”警告

时间:2016-03-20 23:02:46

标签: c++ clang

我的代码中有一个警告让我发疯:

int vasprintf_wrapper(char** bufptr, const char* fmt, va_list ap)
{
    // Do stuff...
    // ...
    return vasprintf(bufptr, fmt, ap);
}

Clang(3.6.0),抱怨“格式字符串不是字符串文字”,指的是正在转发的fmt参数。

天真地,我试图:

return vasprintf(bufptr, reinterpret_cast<const char[]>(fmt), ap);

当然不能编译。

我该怎么办?完全禁用警告不是一种选择。我想要警告。但在这种情况下,我想告诉编译器我知道我在做什么(“着名的遗言”旁边的笑话......)

2 个答案:

答案 0 :(得分:8)

启用此类警告的警告标志为-Wformat-nonliteral。由于您不想完全关闭该警告,因此可以使用以下代码在本地禁用此警告:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wformat-nonliteral"

...

#pragma clang diagnostic pop

所以你的功能看起来像这样:

int vasprintf_wrapper(char** bufptr, const char* fmt, va_list ap)
{
    // Do stuff...
    // ...

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wformat-nonliteral"
    return vasprintf(bufptr, fmt, ap);
#pragma clang diagnostic pop
}

答案 1 :(得分:7)

使用printf标志指示参数是__attribute__ - 样式格式。例如:

__attribute__((__format__ (__printf__, 2, 0)))
int vasprintf_wrapper(char** bufptr, const char* fmt, va_list ap)
{
  ...
}

最后一个参数(0)禁用了对va_list的检查。

来自文档:

  

format (archetype, string-index, first-to-check)

     

format属性指定函数采用printf - ,scanf - ,strftime - 或strfmon - 样式参数,这些参数应为 - 检查格式字符串。

     

参数archetype确定如何解释格式字符串。

     

参数string-index指定哪个参数是格式字符串参数(从1开始)。

     

参数first-to-check是要检查格式字符串的第一个参数的编号。对于无法检查参数的函数(例如vprintf),请将第三个参数指定为零。

另见: