7

我安装了Cppcheck工具来对我的 C++ 项目进行静态代码分析,感觉它的性能很差。例如,谁能告诉我为什么Cppcheck 在以下代码中无法找到数组越界错误?

void f(int c) { 
    char *p = new char[10]; 
    p[c] = 42; 
} 

void g() { 
    f(100); 
} 

有一个在线演示,可以使用 Cppcheck 方便地检查此代码。它所提出的只是第 4 行的内存泄漏,没有潜在缓冲区溢出的迹象。

4

3 回答 3

10

我是一名 Cppcheck 开发人员。

Cppcheck 无法检测到这一点并非设计使然。

Cppcheck 当前不使用来自所有函数调用的所有给定参数来评估函数。我们有这方面的票,我希望有一天能修好。这会很好。

如果您使用 Cppcheck,您不应该认为它会检测到所有错误。Cppcheck 可能无法检测到大多数错误。在我看来,没有任何方法可以检测到您软件中的所有错误。仅使用 Cppcheck 来检测一些您无法检测到的错误。它在一定程度上减少了错误的数量。

我希望你不会太失望,并会继续使用 Cppcheck。

于 2012-08-15T19:40:32.650 回答
9

因为目前不支持。

对于编译器来说,这实际上并不是一个明显的错误。就像是

char c[5];
for (int i=0; i<10; ++i)
    c[i] = 0;

更明显,因为它们都在同一个代码中。

就像是

#define f(c) { \
    char *p = new char[10];  \
    p[c] = 42; \
}

void g() { 
    f(100); 
} 

更明显,因为 cppcheck 和编译器在实际检查之前就地扩展了所有宏。

但是,您发布的代码并非微不足道,因为 cppcheck 以及编译器需要该函数内的整个代码并根据参数对其进行评估。如果该功能在视线范围内当然是可能的(跨翻译单元变得非常困难,甚至不可能),但现在,cppcheck 没有该功能。

于 2012-08-15T09:37:22.700 回答
4

最新版本的 Cppcheck 1.70 dev 能够检测到这个错误:

$ cppcheck test.cpp 
Checking test.cpp...
[test.cpp:3]: (error) Array 'p[10]' accessed at index 100, which is out of bounds.
[test.cpp:4]: (error) Memory leak: p
于 2015-06-19T06:22:40.753 回答