我遇到了#34;冲突"与AnsiString之间s
sprintf member function and Cppcheck's built-in
sprintf`知识。
在这种情况下,
const char* name = "X";
int version = 1;
return AnsiString().sprintf("%s.H%02d", name, version); // <-- HERE
我在Cppcheck GUI中收到此警告
Id:wrongPrintfScanfArgNum
总结:sprintf格式字符串需要0个参数,但是给出了1个。
消息:sprintf格式字符串需要0个参数但是给出了1。
表明Cppcheck正在讨论sprintf
函数,但我使用的是VCL类{{1}的成员函数同名。
为了摆脱这种误报,我可以使用
AnsiString
// cppcheck-suppress wrongPrintfScanfArgNum
AnsiString result; result.printf(...); return result;
函数,表示手动处理缓冲区空间但是所有这些选项都在本地工作,并使代码更难以阅读/维护。
我如何教Cppcheck区分重载名称?
编辑:
sprintf
答案 0 :(得分:2)
有趣。
是的我同意这应该在http://trac.cppcheck.net中报告。看起来像虫子。
我可以看到2个错误。
AST没有显示&#39; AnsiString()&#39;的正确类型信息。即使我添加了AnsiString类。
该库不应该与该代码中的sprintf匹配。很明显,有些方法被称为。
答案 1 :(得分:1)
这确实是一个错误。 [1] Cppcheck 1.75在检查格式字符串时是 smart ,但显然只在某些情况下,其中一个是每个函数的第二个参数称为printf
,因此该问题与AnsiString::sprintf
无关,但与每个替代实现无关。
[1] #7726 (False positive: format string checked for every function called 'sprintf') – Cppcheck