以下代码会在所有主要编译器中产生有关格式说明符错误的警告
std::wstring ws = L"some example string";
char buff[100];
sprintf(buff, "%s", ws.c_str());
如果我们在“可变”上下文(可变模板或va_list)中使用警告,则该警告会消失。
std::wstring ws = L"some example string";
void foo_va_list(const char* fmt, ...)
{
va_list argv;
va_start( argv, fmt );
char buff[1000];
vsprintf(buff, fmt, argv);
va_end(argv);
}
template<typename ... T>
void foo_variadic_template(const char* fmt, T && ... args)
{
char buff[100];
sprintf(buff, fmt, args...);
}
int main()
{
//this two should produce a warning but don't
foo_va_list("foo_va_list %s", ws.c_str());
foo_variadic_template("foo_variadic_template %s", ws.c_str());
char buff[100];
//this one produces warning as expected
sprintf(buff, "sprintf %s", ws.c_str());
}
问题是如何在这种情况下启用此警告?
答案 0 :(得分:0)
某些编译器具有[s]printf
函数的扩展,并且可以“理解”给定的格式字符串,并根据使用的参数检查使用的格式说明符。
如果您在自己的实现中隐藏此关系,显然这些检查将无法进行。