为什么Cppcheck没有找到这个明显的数组越界错误?

时间:2012-08-15 09:04:28

标签: c++ code-analysis static-code-analysis cppcheck

我安装了Cppcheck工具,用于我的C ++项目的静态代码分析,并感觉它表现不佳。例如,任何人都可以告诉我为什么 Cppcheck无法在以下代码中找到数组越界错误?

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

void g() { 
    f(100); 
} 

有一个online demo,可以使用Cppcheck方便地检查此代码。所有这一切都是第4行的内存泄漏,没有潜在缓冲区溢出的迹象。

3 个答案:

答案 0 :(得分:10)

我是Cppcheck开发人员。

Cppcheck未能通过设计检测到这一点。

Cppcheck目前不使用所有函数调用中的所有给定参数来评估函数。我们有关于此的门票,我希望有一天它会被修复。这会很好。

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

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

答案 1 :(得分: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没有这个功能。

答案 2 :(得分: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