在我的一个项目中,我有专有的字符串类(名称为class stringXYZ
),它管理所有的字符串操作。但由于其缺点,我们希望用std::string
替换它。我们完成了更换。问题是stringXYZ
已经重载operator const char*()
,因此每当我向stringXYZ
,printf
,sprintf
提供_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机器时,坚持安装它。建议我使用一些免费/开源静态代码分析器来验证格式说明符或我可以验证格式字符串的其他方法。
提前致谢。
答案 0 :(得分:1)
如果使用g ++编译器,则得到:
错误:无法传递非平凡可复制类型的对象' std :: string {aka class std :: basic_string}'通过' ...'
或
警告:格式'%s'期望参数类型' char *' [-Wformat =]
clang ++有类似的警告/错误。
请注意,即使stringXYZ
有operator const char*
,也是实现定义非平凡可复制类型如何通过省略号(...)传递。