首页 > 解决方案 > 在可变参数模板上下文中缺少有关格式说明符的警告

问题描述

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

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

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

标签: c++printfvariadic-templatesvariadic-functionscompiler-warnings

解决方案


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

显然,如果您在自己的实现中隐藏此关系,这些检查将不起作用。


推荐阅读