Answers:
我在一个使用名为Coverity Prevent的商业静态代码分析系统的地方工作,真是太神奇了!它确实非常复杂和智能。
我们向它扔了大约18 GB的开放源代码和专有C和C ++代码,它会通过代码路径进行跟踪,并迅速发现细微的bug,这将使人类永远追根溯源。查明通常是Heisenbug的东西也很棒。
它每隔几天就会在我们的代码库中运行,并且一个不错的功能是我们可以告诉它“这不是一个真正的错误”,并且它会在将来记住这一点。
陷阱是,Coverity确实很昂贵。他们没有公布成本,但我觉得对于商业项目,每年的起价为数十万美元。但这可能使我们不必雇用一大堆开发人员和质量检查人员,因此总的来说,我们的管理层似乎认为这是一个不错的选择。
有了这些经验,我对静态代码分析非常满意。
从顾问的角度来看,每个静态分析工具都会产生一些噪音,但并非所有静态分析器都是一样的。诸如Coverity,Klocwork,Grammatech之类的静态分析工具都具有良好的分析技术,这些技术应该可以产生更准确的结果。如果您进行更多的调整和调整,通常可以获得更好的结果(毕竟,静态分析器必须能够在从小型医疗设备到网络操作系统的所有不同类型的代码上运行)。定义“噪声”还取决于您构成可修复报告的标准。一方面,一些开发人员将所有未修正的报告都标记为“假”(即使编写得很差的代码,他们也没有时间修正),另一方面,
这些工具中的一些更着重于集中分析,而其他一些更着重于台式机,尽管这三个工具均具有支持这两个工具的功能。正如@Bob所说,它们要花钱。
由于误报率很高,因此您不应为每个编译使用静态分析工具(如lint或FindBugs)。
相反,这是一个不错的检查,一旦发现错误并无法解决,就可以进行咨询。在这种情况下,您可以接受误报,并且您可能已经缩小了错误的可能来源。例如,如果您甚至不执行某些模块就重现了错误,则可以忽略FindBugs为他们所说的话。当您查看一段代码并认为它说了一件事,而编译器按字面意义读取时(例如,在Java中,您使用的equals
方法采用类的类型而不是Object
)时,这特别有用。
您还可以将静态分析工具作为开发过程的一部分:当开发人员进行代码审查时,他们还应在其上运行FindBugs。简而言之,它很有用,但是您不会像编译器或文本编辑器那样经常使用它。