我安装了Cppcheck工具,用于我的C ++项目的静态代码分析,并感觉它表现不佳。例如,任何人都可以告诉我为什么 Cppcheck无法在以下代码中找到数组越界错误?
void f(int c) {
char *p = new char[10];
p[c] = 42;
}
void g() {
f(100);
}
有一个online demo,可以使用Cppcheck方便地检查此代码。所有这一切都是第4行的内存泄漏,没有潜在缓冲区溢出的迹象。
答案 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