我希望g++在vsnprintf中检测以下不正确的隐式转换。
我尝试:
g++ -Wall -Werror -Wconversion -Wformat test.cpp -o test.ext
但是没有警告。代码如下:
#include <cstdio>
#include <cstdarg>
void PrintFError ( const char * format, ... )
{
char buffer[256];
va_list args;
va_start (args, format);
vsnprintf (buffer,256,format, args);
perror (buffer);
va_end (args);
}
enum LEVEL
{
INFO = 1,
WRN = 2
};
int main ()
{
PrintFError ("Error opening %s", WRN); // WRN is enum not char*, expecte some compile warning here
return 0;
}
最佳答案
您必须在函数中添加属性以允许gcc检查:
void PrintFError ( const char * format, ... ) __attribute__ ((format (printf, 1, 2)))
现在最好使用可变参数模板。就像是
template <typename ...Ts>
void PrintFError (const char * format, Ts&&...args)
{
char buffer[256];
vsnprintf (buffer, 256, format, std::forward<Ts>(args)...);
perror (buffer);
}
关于c++ - 如何通过GCC在vsnprintf中检测隐式转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30393665/