C++致命bug静态扫描利器-Pinpoint蚂蚁应用实践

为何要做静态代码分析

在C++项目开发过程中,因为其为编译执行语言,语言规则要求较高,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。所以C++静态代码分析工具能够帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省开发成本。 静态代码分析工具的优势 :
  1. 自动执行静态代码分析,快速定位代码隐藏错误和缺陷。
  2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。
  3. 减少在代码人工检查上花费的时间,提高软件可靠性并节省开发成本。
基于这些优势,将静态代码分析工具集成进持续集成体系,就可在前置流程提早暴露代码的一些基本问题,卡点流程推进,提高代码质量的同时也提高了研发效率。

静态代码分析工具调研

检查规则对比

市场上静态代码分析工具有很多,比如Pinpoint,CppLint、CppCheck、Clang Static Analyzer、Coverity等,部分在蚂蚁内部LinkE的持续集成平台有着广泛的使用,我们对这几种应用较为广泛的工具以及Pinpoint产品在检测规则上做了一下对比。针对业内大量扫描工具在实际项目中扫描结果的影响比较,我们将代码质量问题分为以下几大类:

  • 致命类:可能导致程序宕机、无响应等影响范围极大的错误;
         比如:空指针、越界、内存泄漏、未初始化
  • 逻辑类:可能造成程序不能达到预期逻辑结果的错误;
        比如:相同的条件分支、switch缺少break、除0错误、死循环
  • 编码规范及其他类:可能造成程序的可读性、可维护性较差的错误(不可达代码,无效的变量声明等);
        比如:变量未使用、函数未调用、代码不可达、C风格类型转换、效率问题、安全隐患、编译错误
  • Coverity作为商业化软件,在付费后添加规则上,达到覆盖率最全面,除致命和逻辑类规则外,还有大量编码规范、安全和针对其他语言(如java,C#)的规则;
  • CppCheck作为开源工具,应用范围广泛,根据开源社区场景搜集,在各方面都有规则添加,但场景较为粗犷,场景虽多,但效率不高。
  • Clang作为开源软件,规则较少,规则类型分布较为均匀,在致命、逻辑类,还有编码规范、安全类都有规则添加。
  • Pinpoint支持常见的编程语言C/C++/Java/ObjC, 覆盖了常见的致命和逻辑规则,以及编码标准如Misra,分析算法独特能找到其他工具找不到的安全漏洞。

业务落地探索&成果

通过内部测试,Pinpoint在检测结果准确性、检测速度、产品用户体验以及Devops流程集成上均有着一定的优势,能够更全面的补充CppCheck、Clang等工具上述四点上的不足,作为持续集成流程里质量保证的有力一环,目前已经在蚂蚁内部多个典型的C++产品团队落地,以下为某测试项目的扫描结果简单的展示和分析

问题分析

我们对各个产品中扫描分析出来的典型问题找一个作为样例,展示下问题的检测结果。

比如在线下进行使用CppCheck进行扫描某测试项目时并不能够扫描出类似的空指针问题。在使用Pinpoint进行扫描后发现了3处空指针解引用的问题:





通过实际的问题分析,可知:

  • Pinpoint对“C++的内存和资源误用”,能够对上下文进行一定的分析,进而判断出可能的null pointer dereference。
  • Pinpoint扫描出的“并发和时序错误”,也能发现一些导致多线程死锁的问题。

Pinpoint产品简介

Pinpoint是一款基于定理证明技术的针对源代码质量和安全漏洞全自动分析和管理系统。无需构造测试用例,无需人工干预,全面自动分析和管理程序源码中数百种常见的高危程序缺陷,在发现缺陷的同时还能给出问题的触发过程,Pinpoint对多种高风险高难度漏洞类型的检测上有着极大的优势。主要体现在:

  1. 强大的分析能力
    • 支持全局数据流分析:通过生成函数调用关系图以及逐步过滤技术可有效降低误报率。
    • 支持基于符号分析的约束条件生成:可以很好的描述程序所有可能达到的运行状态。
    • 支持精确的指针分析:在C++中存在大量的使用指针访问数据缓冲区和跨函数传递信息。Pinpoint能够深入分析内存中的程序行为,进行高深度高精度函数调用链分析,查找跨越多层函数的深度问题。
    • 支持模块化和并行化:是保证分析性能可以应对工业规模软件的关键技术。
  2. 实用的扩展和部署功能
    Pinpoint以软件形式部署于Linux实体服务器或虚拟服务器中,可同时支持Linux单机执行和网页远程访问。允许在裸机上远程呼叫安装好的检测服务并得到回传的检测结果。除此之外,Pinpoint支持大规模的分布式部署来提高扫描效率,支持高并发的任务请求。
  3. 多语言支持
    Pinpoint目前支持Java、Android、C/C++、Python、Php、Javascript、Sql、Shell、Objective-C、Golang语言,除了自主研发的语言分析引擎外,也集成了业界比较优秀的开源工具供用户使用。
  4. 完善的报告系统
    Pinpoint拥有完善的报告系统,即可方便的查看扫描出的缺陷详情,也有全局的缺陷趋势对比和多维度度量等。
  5. 自主可控
    Pinpoint目前与国产化海光CPU,麒麟v10 OS均做过验证适配,核心扫描引擎完全自主研发,能够实现对国外同类产品的替换。