10

您使用哪种静态代码分析器(如果有)?我一直在为 Python 使用 PyLint,我对它非常满意,现在我需要类似的 C 代码。

对于正常的日常使用,您必须抑制多少输出?

4

6 回答 6

14

Wikipedia 维护各种语言(包括 C)的静态代码分析工具列表。

就个人而言,我同时使用了PC-LintSplint。最佳选择取决于您编写的应用程序的类型。但是,无论您使用哪种工具,在您正确调整工具和代码之前,都会出现低信噪比。

PC-Lint是我用过的最强大的 Lint 工具。如果将其添加到现有项目中,信噪比可能会很低。但是,一旦正确配置了工具和代码,它就可以用作标准构建过程的一部分。我使用它的最后一个主要项目,我们设置它以便PC-Lint警告会破坏构建。PC-Lint 的许可费用为 389 美元,但物有所值。

Splint是一个很棒的开源工具。我在几个项目中使用过它,但发现在使用具有非 ANSI C 扩展的编译器时(例如,在嵌入式系统项目中)可能难以配置。

Valgrind作为动态分析工具也值得考虑。


您特别要求对SourceMonitor. 该工具为您的代码提供了有趣的指标,但应该用作对好的 Lint 工具的补充,因为它不提供这种分析。

如其主页所述,SourceMonitor将:

...找出您有多少代码并确定模块的相对复杂性。例如,您可以使用 SourceMonitor 来识别最有可能包含缺陷并因此需要正式审查的代码。

我在最近的一个项目中使用它,发现它很容易使用(即使是嵌入式系统代码)。复杂度指标是开发代码的绝佳资源,代码不易出错且更易于维护。

SourceMonitor如果您想自动化指标收集,它提供了漂亮的输出图表以及格式良好的 XML。唯一的缺点是该工具只能在 Windows 上运行。

于 2009-07-17T19:44:47.370 回答
5

我们使用PC-Lint并且对它非常满意。

似乎有一些关于消息抑制和调整的阵营:

  • 压制一切,然后只取消压制你感兴趣的东西
  • 取消抑制所有内容,然后抑制您不感兴趣的警告
  • 保持一切不受压抑

我们倾向于介于第二和第三类之间。这确实意味着跨核心库(大量旧代码)运行的每个 lint 会产生可笑的 100MiB+ 文本转储(每行一个错误)。

类似自定义diff的工具监视更改并将其通过电子邮件发送给提交的作者,这将大多数人必须查看的数量保持在几行。我们通过一些基本的数据挖掘收集了有关随时间变化的错误的有趣统计数据。

您可以在这里得到真正的完善,将错误超链接回更详细的描述,提供修复现有警告的“点”等......

于 2009-07-18T00:57:39.293 回答
4

夹板,但老实说,我一直无法让它工作。在我的平台上,它真的太活跃了。在实践中,我最常用的“lint”是以下警告标志gcc

-std=c89 -pedantic -W -Wall -Wstrict-prototypes -Wunreachable-code  -Wwrite-strings -Wpointer-arith -Wbad-function-cast -Wcast-align -Wcast-qual

当然,我大多忘记了其中一半是什么意思。但他们抓住了很多东西。

于 2009-07-17T19:40:02.417 回答
3

我是 David Evans 在LC/Lint上的工作的忠实粉丝,它显然已将其名称更改为 Splint。它非常具有侵略性,您可以通过在代码中添加注释来告诉它很多有用的信息。 它旨在与程序员注释一起使用。它可以在没有它们的情况下运行,但是如果您尝试将其用作简单的检查器而不提供任何注释,您可能会感到失望。如果您想要的是完全自动化的检查,并且您可以使用仅限 Windows 的工具,那么您最好使用 Gimpel 的PC-Lint。Jim Gimpel 拥有超过 25 年的满意客户。

于 2009-07-18T22:31:22.230 回答
0

我一直使用PCLint并且非常喜欢它。我希望他们能进入 C#... 他们是所有杂志中关于 C 或 C++ 代码的流行测验的人。

于 2009-07-17T19:27:50.493 回答
0

llvm clang 项目中有一个http://clang-analyzer.llvm.org。我自己没有尝试过,但我打算这样做。

它看起来相当不错:http: //www.mikeash.com/? page= pyblog/friday-qa-2009-03-06-using-the-clang-static-analyzer.html 以上是针对Objective-C的,但是对于 C 来说应该是一样的。

于 2009-07-17T20:23:19.927 回答