首页 [静态分析]C++代码优化思路及其工具
文章
取消

[静态分析]C++代码优化思路及其工具

随着示波器的应用软件工程代码量增大,手工review代码变得麻烦。主要优化方面又:

  • 内存池

  • 内存泄漏检测

  • 接口设计优化

  • ucm优化

  • 采用异常代替错误码

昨天仔细考虑另外以下基本的模块的架构后,决定先用进行静态分析和代码覆盖的检查优化。

C++静态分析工具

我选用了cppcheck,有windows和跨平台的qt界面,作为qt工程编译出来gui软件后将代码根目录导入即可查看其分析结果。相对gnu编译器来说,其分析更加详细。主要对初始化、无用变量赋值、内存delete检查及警告等进行了提示。逐条排插即可。 静态分析工具cppchecker

C++代码覆盖率检查工具

代码覆盖不仅仅时语句的覆盖,更重要的时逻辑上的覆盖。这个概念和单元测试息息相关。因为对工程没有那么庞大,还没有考虑进行单元测试,我现在使用代码覆盖率主要用于去除冗余代码,测试未覆盖代码和错误分支等方面。

1. 语句覆盖(StatementCoverage) 语句覆盖主要度量被测代码中每个可执行语句是否被执行到了。 测试人员的测试结果会告诉你,他的代码覆盖率达到了100%,并且所有测试案例都通过了。然而遗憾的是,我们的语句覆盖率达到了所谓的100%,但是却没有发现最简单的Bug,比如,当我让b=0时,会抛出一个除零异常。正因如此,假如上面只要求测试人员语句覆盖率达到多少的话,测试人员只要钻钻空子,专门针对如何覆盖代码行编写测试案例,就很容易达到主管的要求。

2. 判定覆盖(DecisionCoverage) 又称分支覆盖(BranchCoverage),所有边界覆盖(All-EdgesCoverage),基本路径覆盖(BasicPathCoverage),判定路径覆盖(Decision-Decision-Path)。它度量程序中每一个判定的分支是否都被测试到了。这句话是需要进一步理解的,应该非常容易和下面说到的条件覆盖混淆。因此我们直接介绍第三种覆盖方式,然后和判定覆盖一起来对比,就明白两者是怎么回事了。

3. 条件覆盖(ConditionCoverage) 它度量判定中的每个子表达式结果true和false是否被测试到了。

4. 路径覆盖(PathCoverage) 又称断言覆盖(PredicateCoverage)。它度量了是否函数的每一个分支都被执行了。 这句话也非常好理解,就是所有可能的分支都执行一遍,有多个分支嵌套时,需要对多个分支进行排列组合,可想而知,测试路径随着分支的数量指数级别增加。还有一些其他的覆盖方式,如:循环覆盖(LoopCoverage),它度量是否对循环体执行了零次,一次和多余一次循环。

下面是现在工程的覆盖率检查,不忍直视,任重道远啊。

代码覆盖率

本文由作者按照 CC BY 4.0 进行授权