在我的一个项目中,我有一个专用的string类(名为class stringXYZ),它管理所有的字符串操作。但是由于它的缺点,我们想用std::string代替它。我们不想再换了。问题是stringXYZ有一个operator const char*()重载,所以每当我将stringXYZ交给任何printf、sprintf、_snprintf时,它都会转到char*。我们在std::string中没有这样的特性。甚至Microsoft的编译器也无法找到以下问题:
char szBuff[255] = {0};
std::string strErr = "Improper arguments";
_snprintf(szBuff, sizeof(szBuff), "Error = %s", strErr);以前,由于stringXYZ类重载了const char*运算符,所以strErr用于正确地转换。但是现在,当我移到std::string时,我无法检测到这个错误。一种选择是将变量的名称从strErr更改为strErr123,编译和验证格式说明符。但这需要很长时间,因为我们有很多字符串变量。我选择了静态代码分析器,发现FlawFinder对我的情况很有用。但是当我在运行一台windows机器时,它的安装就被困住了。建议我使用一些免费/开源的静态代码分析器来验证格式说明符,或者其他一些方法,通过这些方法我可以验证格式字符串。
提前谢谢。
发布于 2015-05-28 17:16:13
如果使用g++编译器,您将得到:
错误:无法传递非复制类型的对象'std::string {aka类std::basic_string}‘通过’.‘
或
警告:格式化'%s‘期望类型为'char*’的参数-Wformat=
clang++对此也有类似的警告/错误。
注意,即使stringXYZ有一个operator const char*,实现也定义了如何通过省略号(.)传递不可复制的类型。
https://stackoverflow.com/questions/30507195
复制相似问题