验证_snprintf中的格式说明符 - C ++

时间:2015-05-28 12:54:48

标签: c++ string validation format

在我的一个项目中,我有专有的字符串类(名称为class stringXYZ),它管理所有的字符串操作。但由于其缺点,我们希望用std::string替换它。我们完成了更换。问题是stringXYZ已经重载operator const char*(),因此每当我向stringXYZprintfsprintf提供_snprintf时,它都会转到{ {1}}。我们在char*中没有此类功能。甚至微软的编译器也无法找到如下问题:

std::string

以前,当char szBuff[255] = {0}; std::string strErr = "Improper arguments"; _snprintf(szBuff, sizeof(szBuff), "Error = %s", strErr); 班级stringXYZ运算符重载时,const char*用于正确转换。但是现在当我搬到strErr时,我无法检测到这个错误。一种选择是将变量的名称从std::string更改为strErr,编译并验证格式说明符。但是由于我们有很多字符串变量,因此需要很长时间。我去了静态代码分析器,发现 FlawFinder 对我的情况很有用。但是当我在运行Windows机器时,坚持安装它。建议我使用一些免费/开源静态代码分析器来验证格式说明符或我可以验证格式字符串的其他方法。

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果使用g ++编译器,则得到:

  

错误:无法传递非平凡可复制类型的对象' std :: string {aka class std :: basic_string}'通过' ...'

  

警告:格式'%s'期望参数类型' char *' [-Wformat =]

clang ++有类似的警告/错误。

请注意,即使stringXYZoperator const char*,也是实现定义非平凡可复制类型如何通过省略号(...)传递。