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



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

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

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

我是 Cppcheck 开发人员。

Cppcheck未能检测到这一点并不是设计使然。

Cppcheck 目前不会使用来自所有函数调用的所有给定参数来评估函数。我们有关于这个问题的票证,我希望有一天它会得到解决。那就太好了。

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

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

因为它目前不受支持。

对于编译器来说,这实际上不是一个明显的错误。类似的东西

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没有该功能。

最新版本的 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

最新更新