处理"不兼容"在Cppcheck

时间:2016-09-05 09:23:37

标签: c++ overloading static-analysis cppcheck false-positive

我遇到了#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
  • 很重要

2 个答案:

答案 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