我们还需要做静态分析吗?

时间:2014-04-15 10:26:05

标签: c++ c static-analysis

我的老板认为我们编写的任何代码(在C / C ++中)都必须符合静态分析工具(如MISRA / Lint)指定的标准。我对此的看法是因为编译器今天发展得很好,这真的需要吗?

这里的问题是这些静态分析的效果如何?

6 个答案:

答案 0 :(得分:36)

简短回答:是的。

答案很长:编译器确实在分析某些类型的错误"时已经越来越好了,但是"深度"他们的工作通常比适当的工具要少得多。特别是在编译单元之间工作的工具,例如Coverity,它可以理解(例如)一个函数可能会将指针返回NULL,如果这样,你的代码就会崩溃,因为你不会在访问指针之前检查NULL

静态分析工具也可以检查锁的使用情况,编译器通常不会这样做。

关于"效果如何"它确实取决于您使用的工具,设置以及您测试代码的能力。所以,"代码覆盖率"也进入了它。您是否在测试中浏览了代码的每个分支?每一个可能导致行为差异的价值?静态分析工具可以检测您的测试可能无法覆盖的错误。

(显然,在你的特定业务中是否真的有意义是一个完全不同的讨论 - 这对你的老板和他/她的老板来说是决定的)

答案 1 :(得分:6)

并非编译器无法进行静态分析工具的分析。问题是静态代码分析需要花费大量时间,并且通常不需要每次编译。编译器通常针对代码质量和编译时间的平衡进行优化。如果编译器碰巧遇到代码中的错误,它会告诉你,但它没有时间主动查找错误。

答案 2 :(得分:4)

此外,静态分析对于生成指标非常重要。

这些指标可以显示:圈复杂度,类继承的深度以及许多其他/依赖关系图/评论的百分比等等(Understand有一个完整的功能列表)。

一个好处是,大多数静态分析工具允许您添加特定规则,如果您的项目/公司有编码规则,这些规则可能很有用。

您还可以添加“持续集成”服务器,每天检查您的svn / git /其他开发分支,并在晚上进行分析。这样,第二天您就可以修复不符合规则集的代码。

答案 3 :(得分:4)

是的,它增加了对代码的信心。

MISRA规则广泛用于实时系统。许多软件审核员都要求遵守MISRA(通过运行misra支持的工具)。

此外,MISRA(或类似标准)定义了一些繁琐的规则,以防止用户在某些编译器上执行可能出错的花哨内容。例如,MISRA禁止指针算术,但没有编译器会给你一个警告。

修改 另一个例子:以下代码正在做许多人不期望的事情(由于浮点精度,x!= 1.1)。

int main(int agrc, char** argv){

    float x = 1.1;
    if(x == 1.1)
        printf("Yes!\n");
    else
        printf("OMG!\n");
    return 0;
}

编译器未检测到这种情况(在gcc 4.6和clang 3.2上尝试过)。但它几乎被所有静态分析工具检测到。

答案 4 :(得分:3)

良好的静态分析工具可以分析诸如周期性复杂性之类的事情,甚至可以分析诸如代码气味之类的事情。 (参见Martin Fowler的重构书)。甚至文件或函数中的行数也是可以改进代码的线索。不过,我不认为林特会涵盖这些领域。

答案 5 :(得分:3)

是否还需要静态分析工具?绝对。编译器发出的警告变得越来越复杂,但仍然存在编译器通常一次对一个源文件起作用的限制。每个文件都被编译(* .c - > * .o),结果对象文件最后链接在一起。要进行真正有效的静态分析,您需要立即查看整个代码库,分析单个文件以及它们之间的交互。编译器通常不是那样设计的,因此单独的编译器通常会错过静态分析器拾取的各种东西。您不希望将此功能构建到普通编译器中,因为它会对性能产生相当大的影响。在我当前项目上运行的静态分析通常需要正常编译所需时间的4倍。您不希望在每个构建上都有额外的开销,因此最好将其分配给单独的专用工具,而不是在需要时运行(或者在某些现代编译器的情况下,一组单独的命令行选项)默认禁用)。

静态分析的效果如何?非常。我的团队通过静态分析工具发现了大量潜在的问题,其中大多数使用其他方法几乎不可能找到。它特别擅长发现人类不擅长发现的复杂问题,比如那些涉及多个局部和全局变量之间相互作用的问题。即使您具有出色的测试覆盖率,静态分析仪也会发现通过单独测试很难找到的各种事物。在嵌入式世界中更是如此,其中测试往往更加困难,而且自动化程度更低。根据我的经验,静态分析仪甚至向我们展示了我们甚至不知道我们需要首先进行测试的问题。

我肯定会建议对任何非平凡的软件项目使用静态分析工具。我实际上运行了两个独立的静态分析器(一个内置在编译器套件中,另一个是单独的实用程序);你可能会惊讶于一个人会抓住而另一个人会错过。我强烈建议您为分析运行提供一组自定义的规则/测试,而不是简单地采用像MISRA这样的规则集。每个项目的需求都是不同的,像MISRA这样的许多行业规范都包含了大多数人不需要的东西。你正在检查的东西越多,分析所需的时间就越多,你需要涉及的误报就越多等等。