C++:vsprintf的安全使用



我有一个较大的代码库来执行log_msg("Here comes %s", "the text"),其中log_message是一个宏,它将函数名和行号添加到日志消息中。

当格式字符串与提供的参数不匹配时,GCC/G++会警告错误。不幸的是,有时代码会调用log_msg(get_the_text())get_the_text()的返回值在编译时是未知的,因此如果它包含一些printf格式序列,代码将完全失败。

我正在寻找的是一种通过不同的代码路径来路由单参数用法的方法,该路径不解释格式化代码。我尝试了这样的方法,希望非变异病例比变异病例更具体:

void log_the_message_implementation(const char *filename, const char *funcname, const char *msg);
void log_the_message_implementation(const char *filename, const char *funcname, const char *msg, ...);

我希望编译器在没有变量args的情况下选择单参数函数,但它抱怨调用不明确。

如何在不更改来自log_msg(get_the_text())log_msg("%s", get_the_text())

感谢@SamVarshavchik,这就是我想到的:

#include <iostream>
#include <cstdio>
#include <tuple>

template<typename ... Args>
void log(Args ... args) {
if (sizeof...(args) == 1) {
auto t = std::make_tuple(args...);
std::puts(std::get<0>(t));
} else {
std::printf(args...);
}
}
int
main() {
log("Test %d");
log("%s %dn", "Test", 1);
log([]{ return "%s";}());
return 0;
}

相关内容

  • 没有找到相关文章

最新更新