在可变参数模板上下文中缺少有关格式说明符的警告

时间:2018-12-03 09:02:28

标签: c++ printf variadic-templates variadic-functions compiler-warnings

以下代码会在所有主要编译器中产生有关格式说明符错误的警告

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());
}

问题是如何在这种情况下启用此警告?

1 个答案:

答案 0 :(得分:0)

某些编译器具有[s]printf函数的扩展,并且可以“理解”给定的格式字符串,并根据使用的参数检查使用的格式说明符。

如果您在自己的实现中隐藏此关系,显然这些检查将无法进行。