C++静态分析工具漏检数组越界问题排查与工具咨询
C++静态分析工具数组越界漏报问题
问题现象
我们使用Klocwork 2021.1版本进行C++静态分析,多名同事反馈工具存在*漏报(False Negative)*情况。将问题简化为如下测试代码:
int theIndex = 40; int main() { int arr[10] = {0,1,2,3,4,5,6,7,8,9}; return arr[theIndex]; }
这段代码存在明确的数组越界访问(下标40远大于数组长度10),但Klocwork未报告该缺陷。
补充测试:CppCheck和SonarQube同样未能检测出这个问题!
但测试以下代码时,工具却能正常检测出数组越界:
int main() { int theIndex = 40; int arr[10] = {0,1,2,3,4,5,6,7,8,9}; return arr[theIndex]; }
我推测Klocwork未将main()视为唯一入口,因此假设全局变量theIndex可能在main()调用前被修改。
另外测试了如下版本:
int theIndex; int foo() { const int arr[10] = {0,1,2,3,4,5,6,7,8,9}; return arr[theIndex]; } int main() { theIndex = 40; return foo(); }
CppCheck判定这段代码“无bug”。
疑问列表
- 是否是工具配置有误?
- 应如何调整配置?
- Klocwork是否应当检测出该问题,还是这属于静态分析工具的局限性?
- 是否有能检测此类问题的优质工具?
补充说明
正如推测的那样,静态分析工具认为其他编译单元可能修改theIndex的值,因此未报告问题。将其声明为static int theIndex = 40时,工具就能检测到该问题。
新疑问
Klocwork已获取完整构建规格,理论上可以追踪软件的所有分支及theIndex的可能取值(这可能存在计算局限性):
- 是否有方法指示工具进行此类追踪?
- 类似“链接阶段”的分析?
内容的提问来源于stack exchange,提问作者Tomer W
相关产品推荐
相关产品推荐

