我的代码中有一个警告让我发疯:
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);
当然不能编译。
我该怎么办?完全禁用警告不是一种选择。我想要警告。但在这种情况下,我想告诉编译器我知道我在做什么(“着名的遗言”旁边的笑话......)
答案 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
),请将第三个参数指定为零。
另见: