c++ - 在可变参数模板上下文中缺少有关格式说明符的警告
问题描述
以下代码会在所有主要编译器中生成有关错误格式说明符的警告
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());
}
问题是如何在这种情况下启用此警告?
解决方案
一些编译器对[s]printf
函数进行了扩展,可以“理解”给定的格式字符串,并根据使用的参数检查使用的格式说明符。
显然,如果您在自己的实现中隐藏此关系,这些检查将不起作用。
推荐阅读
- azure-stream-analytics - Azure 流分析测试查询编辑器与 ComosDB 和 Blob 中的最终输出不匹配
- git - 通过 SSH 镜像到 Github 时 Git 挂起
- javascript - 未捕获的类型错误:无法设置未定义选择的 jquery 的属性“选择”
- php - 如果在输入类型文件中没有选择文件,则添加行
- php - 允许匹配 - 特殊字符只能连续出现一次
- excel - 当在 Sheet1 上单击宏按钮时,Excel VBA 代码在 Sheet2 上设置值
- css - 无法修改选项卡指示器颜色
- ios - XLPagerTabStrip 库中单个视图控制器中的多个 ButtonBarView
- uiscrollview - Swift 4,如何将大量图书馆照片放入uiscrollview?
- machine-learning - 在可用数据很少的情况下如何预测收入?