静态代码分析工具:C-STAT助力提高代码质量

《应用编码标准和自动化工具,提高代码质量》一文中,重点探讨了在嵌入式开发中,应用编码标准和自动化工具,是如何帮助提高代码质量和生产力的。其中静态代码分析工具是非常重要的自动化检测工具。

本文将介绍IAR C-STAT静态代码分析工具的设计理念和特点,以及如何在日常开发过程中,快速上手使用C-STAT进行静态代码分析来提高代码质量。

C-STAT设计理念和特点

部署在最初开发阶段,改善Bug曲线

在软件开发过程中,Bug的数量随着时间的变化而变化形成的曲线,称之为Bug曲线。在最初阶段,开发人员在代码实现和测试阶段发现和修复的Bug数量最多,而在项目进展到后期,Bug数量逐渐减少。最终,Bug数量会趋于稳定,随着软件发布和生产使用,仍然会有新的Bug被发现。因此一般的Bug曲线是先呈上升的趋势(斜率较大)随后呈慢速稳定的趋势(斜率变小),最终实现曲线的收敛。

根据这样的曲线特性,如果在软件开发的早期阶段尽可能多地发现Bug和潜在的问题,提高代码质量,那么Bug曲线会在早期呈现快速上升的趋势,并在较短的时间内稳定下来并收敛,从而形成较好的Bug曲线。下图中展示了一般的Bug曲线和使用了自动化工具后的Bug曲线的对比示意图。

china-learn-code-quality-11.png

从Bug曲线上,可以看到,尽可能早的部署自动化工具,那么对于提高代码质量是至关重要的,同时也可以有效的减少项目的时间和成本。因为Bug发现得越早,越容易修复,修复的成本也越低;反之,Bug发现得越晚,越难修复,修复的成本也越高,如图所示:

china-learn-code-quality-12.png

IAR C-STAT 静态代码分析工具在设计之初,就考虑到这个需求,把它作为一个插件集成到IAR Embedded Workbench中,使开发人员在代码编写阶段就可以部署使用,这样可以尽早地、更多地发现代码中的Bug,提高代码质量,降低Bug修复成本,减少项目开发时间。

china-learn-code-quality-13.png

日常开发过程中即时反馈

Google 在 ACM 出版物上的一篇文章 Lessons from Building Static Analysis Tools at Google,探讨了应用静态代码分析的问题。文章对他们的整个代码库,包括C、 C++和Java进行了全面的考察,结果非常明显:

“在开发过程的早期就能发现编译器错误,并且能够整合到开发人员的工作流程中。我们发现扩大编译器的检查集对提高Google的代码质量是有效的。”

作者表示,将静态分析检查整合到编译器工作流程并使其作为错误出现,极大地提高了开发人员对工具信息的关注,最终大幅提升代码质量。

此外,文章还谈到了将代码分析整合到开发工作流程的重要性,指出当他们通过静态分析工具自动运行提交的代码并邀请工程师查看分析结果时,很少有工程师跟进。但是,如果在工程师开发过程中就能得到即时反馈,那么就会让更多人使用静态分析,且分析结果也更难被忽视。因此, Google选择在每个人的工作流程中默认集成静态分析。他们认为要推广代码分析工具,开发人员必须感到能从中受益,并且喜欢使用这些工具。

IAR C-STAT完美符合这样的理念,作为插件完全集成到IAR Embedded Workbench中(如下图所示),不改变整个项目的开发流程,而是作为一个可应用于工程师日常开发过程中的增强型的工具,在每完成一个软件模块,甚至是一个函数,就可以立即使用它进行静态分析得到即时反馈。

china-learn-code-quality-14.png

开箱即用,无需安装和集成

由于大多数第三方的静态分析工具需要适应不同项目的软件环境和需求,往往需要专门的人员针对项目进行安装,配置,管理和和维护,包括但不限于

  • 安装和配置:安装静态分析工具,并配置相应的软件环境;
  • 和项目集成:需要针对项目,把静态工具集成到项目的构建系统中;
  • 配置分析选项:根据项目需求进行规则的选取,设置规则和限制;
  • 定期更新:需要定期更新工具;

调查发现,由于需要额外建立对应的静态代码分析工程,以及需要在构建(build)之后切换到静态代码分析工具等原因,很多第三方的静态分析工具都没有很好地在开发人员日常开发过程中使用,而是到了项目的中后期才统一对工程进行静态分析,导致很多Bug到了后期才被发现和修复。IAR C-STAT无缝集成到IAR Embedded Workbench中,无需任何的安装和集成工作,也无需考虑工具的更新,仅仅只需根据项目的需求,在IAR Embedded Workbench IDE中进行简单的配置(如下图),即可开始分析工作,实现开箱即用。这极大的降低了静态分析工具的使用门槛,使得开发人员乐于使用它并从中得益。

china-learn-code-quality-15.png

同时,IAR C-STAT还支持导入/导出相关的规则设置,保证在整个项目团队中使用同样的规则,协调一致。

灵活的规则设置,支持MISRA/CWE/CERT

C-STAT 支持来自不同编码标准和规则集的大约 700 个规则,包括来自 CERT 和 CWE 倡议的规则,以及 MISRA C:2012、MISRA C++:2008 和 MISRA C:2004。

china-learn-code-quality-16.png

STDCHECKS检查规则集包含检查映射到CWE的规则,以及C-STAT特定的规则;

CERT检查规则集包含针对CERT的检查。此外,某些CERT规则和建议可以通过检查其他标准规则进行验证;

SECURITY检查规则集包含来自于SANS Top25, OWASP and CWE的规则;

MISRAC2004,MISRAC2012和MISRAC++2008分别包含了对应于相应MISRA标准的检查规则集。

不同标准中的规则相互重叠,相互补充。CWE提供软件中已知缺陷的概要,而CERT和MISRA标准识别可能暴露软件缺陷的编码结构。没有一种编码标准包括CWE中的所有条目,因为并非所有条目都以一种编码语言出现。此外,一些缺陷与设计问题有关。同时,并非MISRA或CERT定义的所有编码指南都可以映射到CWE中的条目,因为有问题的编码结构并不总是与特定列出的缺陷直接相关。但是,CERT在适用的情况下确实包含对CWE条目的引用。由于它们相互支持的作用,有必要根据项目的需求,定制自己的的检查规则集,确保软件安全可靠。

而C-STAT完全集成到IDE中,无需复杂的工具设置,直接采用勾选的方式,可以按照某个规则集,或者某个子规则集,甚至某条规则进行选择,能把不同的规则集结合起来,提供了最大的灵活性。C-STAT中的所有检查均参考CWE以及MISRA和CERT标准中的相应条目进行了完整记录,可以非常直观的得到相关规则的信息。

C-STAT快速上手

选择规则

右键点击对应项目工程文件,选择并点击”Options-> Static Analysis-> Select C-STAT Checks…”,即可进行检查规则的选择。

china-learn-code-quality-17.png

配置规则

在规则的配置框中,可独立的选择应用一组规则,或者仅仅应用某条规则。如需详细了解某条规则的具体描述,点击高亮它后,按F1即可获取详细信息

china-learn-code-quality-18.png

分析代码

C-STAT支持按照项目,或者组,或者单个文件进行分析。右键点击项目工程文件(或者某组,某文件),点击C-STAT Static Analysis -> Analyze Project (或Analyze File(s)),即可开始分析代码,结果会显示在C-STAT Messages窗口中。

china-learn-code-quality-19.png

分析结果

在C-STAT Messages 窗口中,可以按照Severity过滤分析结果。双击Message,即可以跳转到对应的源代码,如需了解该Message的详细信息,直接按F1即可。

china-learn-code-quality-20.png

生成报告

右键点击项目工程文件,选择并点击“C-STAT Static Analysis ->Generate Full HTML Report” 可生成HTML格式的报告,供后续分析。也可以选择“Generate HTML Summary”,获取概要报告。

china-learn-code-quality-21.png

总结

静态代码分析工具可以帮助开发人员检测出代码中很多跟实现相关的潜在Bug。日常开发过程中的即时反馈对于开发人员使用静态分析工具非常重要。IAR的C-STAT静态代码分析工具完全集成在IAR Embedded Workbench中,无需任何安装和静态代码分析工程创建,只需要进行简单的规则设置,就可以在构建(Build)成功之后进行静态代码分析,非常适合开发人员在日常的开发过程中使用,尽早发现代码中的潜在Bug,提高代码质量,提高开发效率,降低开发成本。同时开发人员在日常开发过程中使用静态代码分析工具,可以极大地提升开发人员的水平,进一步提高代码质量。

 

参考文献:

  1. https://cacm.acm.org/magazines/2018/4/226371-lessons-from-building-static-analysis-tools-at-google/fulltext
  2. https://www.iar.com/knowledge/learn/functional-safety/fast-functional-safety-certification-for-your-project/
  3. https://www.iar.com/products/c-stat/
  4. https://www.iar.com/knowledge/learn/code-quality/static-analysis-who-makes-the-rules/
  5. https://www.iar.com/knowledge/learn/code-quality/to-c-or-not-to-c-deeper-code-insights-through-static-analysis/
  6. IAR C-STAT Guide

We do no longer support Internet Explorer. To get the best experience of iar.com, we recommend upgrading to a modern browser such as Chrome or Edge.