代码扫描工具

        静态代码分析是指无需运行代码,通过词法分析、语法分析、控制流、数据流分析等技术对代码进行扫描,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。

在C++项目开发过程中,因为其为编译执行语言,语言规则要求较高,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。所以C++ 静态代码分析工具能够帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省开发成本。

业界主流静态代码扫描工具概况

        目前市面上的C++ 静态代码分析工具种类繁多且各有千秋,本文将介绍主流C++静态代码分析工具并从可扩展性,功能,效率等方面对它们进行分析和比较,以帮助 C++开发人员更清晰静态代码分析工具的工作效果、适用场景和扩展空间,同时在其对应项目特征中选择合适的工具应用到项目开发环节中,我在这里选择了5个业内使用率较高的工具(cppcheck、coverity、clang、pclint、TscanCode)做详细对比。

可扩展性对比

        TSC是C++编写的开源的静态代码分析工具,最早是建立在cppcheck基础上后来经过重构,最近的更新记录在3年前,网上资料相对于cppcheck和clang较少,进行二次开发学习成本高;

        coverity作为商业化软件,在付费后添加规则上,达到覆盖率最全面,除致命和逻辑类规则外,还有大量编码规范、安全和针对其他语言(如java,C#)的规则;

        cppcheck作为c++编写的开源工具,应用范围广泛,根据开源社区场景搜集,在各方面都有规则添加,资料也相对较多但场景较为粗犷,场景虽多,但有效率不高。例如:cppcheck在初始化检查上有5个子规则,样本代码共扫描出312个问题,其中有效问题仅8个,有效率仅为3%。

        pclint作为商业化软件,在付费后添加规则上,达到覆盖率最全面,除致命和逻辑类规则外,还有大量编码规范、安全的规则;

        clang作为开源软件,规则较少,但规则类型分布较为均匀,在致命、逻辑类,还有编码规范、安全类都有规则添加,网上资料也相对较多。

付费价格、规则数量、准确率、扫描效率、编译依赖、IDE支持、跨平台支持、可扩展开发方面的对比:

代码扫描工具_第1张图片

检查规则比较

 致命类:可能导致程序宕机、无响应等影响范围极大的错误;

 逻辑类:可能造成程序不能达到预期逻辑结果的错误;

 编码规范及其他类:可能造成程序的可读性、可维护性较差的错误(不可达代码,无效的变量声明等);

代码扫描工具_第2张图片

同类规则效果对比分析

空指针检查规则主要检查是否存在对赋值为空的指针解引用的情况,空指针是c/c++中最大的问题,经常造成程序崩溃的致命错误。因此,C++静态代码分析工具对空指针的检查能力显得尤为重要

代码扫描工具_第3张图片

越界一般来讲是指数组下标越界,或者缓冲区读写越界。这类错误会导致非法内存的访问,引发程序崩溃或者错误。

代码扫描工具_第4张图片

变量未初始化顾名思义:变量声明后没有赋初值,其分配的内存值是随机的。这也是代码中容易出现的问题,会导致不确定的程序行为,造成严重的后果。

代码扫描工具_第5张图片

逻辑错误:指可能存在的逻辑问题,如if不同分支内容相同,在switch内缺少break等,对指针使用sizeof进行空间分配等问题。

代码扫描工具_第6张图片

内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存,从而造成了内存浪费的情况。内存泄漏是静态下很难检测的一种错误,一般需要动态分析工具进行检测,监控内存分配和释放,从动态上检测程序是否存在内存泄漏。因此,静态代码分析能检查的内存泄漏就非常有限了,当前各工具主要是从代码写法上检查内存分配和释放是否配对使用。比如:fopen打开文件后在退出函数前是否有执行fclose,new[]和delete[]是否配对使用等

代码扫描工具_第7张图片

结论

 通过以上对比,如果是全部模块由自己去完成的代码,建议使用TSC或者coverity进行代码扫描

你可能感兴趣的:(STL源码分析,window程序问题,linux,mfc,c++,源代码管理)