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

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.

  • 对不起,但它**是*设计CppCheck无法检测到OP的问题.CppCheck*被设计*用于生成语言标记流,并应用"模式"来检查令牌序列是否存在问题.但是,标记化器不能真正理解语言中的类型信息,因此不能进行任何"类型"相关的检查.当然,只要有足够的能量,就可以通过处理令牌来添加所有类型信息,但到那时你就拥有了全功能的C++前端,这似乎并不是CppCheck的野心.这个工具在严格的静态分析中不能走得太远. (3认同)
  • 我对Cppcheck并不感到失望,它是一个很棒的开源项目.我只是不太了解它的局限性.谢谢你的解释. (3认同)

Seb*_*ach 9

因为目前不支持它.

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

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没有这个功能.