dok*_*par 7 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);
}
Run Code Online (Sandbox Code Playgroud)
有一个在线演示,可以使用Cppcheck方便地检查此代码.所有它提到的是第4行的内存泄漏,没有潜在缓冲区溢出的迹象.
Dan*_*äki 10
我是Cppcheck开发人员.
Cppcheck未能通过设计检测到这一点.
Cppcheck目前不使用所有函数调用中的所有给定参数来评估函数.我们有关于此的门票,我希望有一天它会被修复.这会很好.
如果您使用Cppcheck,您不应该认为它会检测到所有错误.Cppcheck可能无法检测到大多数错误.我的拙见没有办法可以检测到你软件中的所有错误.使用Cppcheck只检测一些您无法检测到的错误.它有点减少了bug的数量.
我希望你不要太失望,并继续使用Cppcheck.
因为目前不支持它.
这对编译器来说实际上不是一个明显的错误.就像是
char c[5];
for (int i=0; i<10; ++i)
c[i] = 0;
Run Code Online (Sandbox Code Playgroud)
更明显,因为它们都在相同的代码中.
就像是
#define f(c) { \
char *p = new char[10]; \
p[c] = 42; \
}
void g() {
f(100);
}
Run Code Online (Sandbox Code Playgroud)
更明显,因为cppcheck和编译器在实际检查之前就地扩展所有宏.
但是,您发布的代码并不简单,因为cppcheck以及编译器需要该函数内的整个代码并根据参数对其进行评估.当然,如果功能在视线中是可能的(在翻译单元中变得相当困难,甚至是不可能的),但是现在,cppcheck没有这个功能.