C语言的静态代码分析工具

11

你使用哪种静态代码分析器(如果有的话)?我一直在使用Python的PyLint,对它相当满意,现在我需要类似的东西来分析C代码。

在日常使用中,你需要压制多少输出?


进一步说,有人使用过SourceMonitor(http://www.campwoodsw.com/sourcemonitor.html)吗?你会如何评价它? - Josip
1
重复的问题:https://dev59.com/23VD5IYBdhLWcg3wXaYd? - Steve Melnikoff
6个回答

14

维基百科维护着一个静态代码分析工具列表,适用于各种语言(包括C语言)。

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

PC-Lint是我使用过的最强大的Lint工具。如果将其添加到现有项目中,则信号噪声比可能较低。但是,一旦正确配置工具和代码,它可以作为标准构建过程的一部分使用。我上次使用它的最后一个主要项目中,我们将其设置为PC-Lint警告将中断构建。PC-Lint的许可证费用为389美元,但这是值得的。

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

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


您特别要求对SourceMonitor进行反馈。该工具提供有趣的代码度量,但应作为良好Lint工具的补充使用,因为它不提供那种分析。

正如其主页上所述,SourceMonitor将:

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

我在最近的项目中使用它,并发现它易于使用(即使是嵌入式系统代码)。 复杂度指标是开发更少出错且易于维护的代码的极好资源。

SourceMonitor提供其输出的漂亮图形以及格式良好的XML,如果您想自动化度量收集。唯一的缺点是该工具仅在Windows上运行。


你对Splint的看法非常有用,因为我正在使用Microchip C18编译器,它只支持少量的C扩展。谢谢。 - Josip

5

我们使用 PC-Lint 并对其感到非常满意。

关于消息抑制和调整,似乎有几个派别:

  • 抑制所有内容,然后取消抑制您感兴趣的内容
  • 取消抑制所有内容,然后抑制您不感兴趣的警告
  • 保持所有内容未抑制

我们倾向于在第二和第三类之间。这意味着每次进行 lint 运行时核心库(大量旧代码)会产生荒谬的 100MiB+ 文本转储(每行一个错误)。

一个类似自定义 diff 工具会监视更改并将其发送到提交作者的电子邮件中,这可以使大多数人需要查看的内容减少到几行。我们通过一些基本的数据挖掘收集有关错误随时间变化的有趣统计信息。

您可以在此处进行真正的精细处理,将错误超链接回更详细的描述,为修复现有警告提供“积分”等等...


4

有一个splint,但说实话,我从未能够让它工作;在我的平台上,它真的太过活跃了。 实际上,我最常用的“lint”是以下gcc警告标志:

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

当然,我大部分都忘记了它们的含义。但是它们能捕捉到许多东西。

"lint"和编译器警告之间存在很大的区别,因为"lint"可以进行跨模块检查,而编译器只能警告已编译源文件和包含的头文件中出现的问题。 - Dipstick

3

我是David Evans在LC/Lint方面的忠实粉丝,它现在已经改名为Splint。它非常强大,通过向代码添加注释,您可以告诉它很多有用的信息。它专为程序员注释而设计。如果没有注释,它也能正常运行,但是如果您尝试将其用作简单的检查器而不提供任何注释,您可能会感到失望。如果您想要完全自动化的检查,并且可以使用仅限Windows的工具,则最好选择Gimpel的PC-Lint。Jim Gimpel已经拥有超过25年的满意客户。


0

我一直使用PCLint,非常喜欢它。但我希望他们能够涉足C#领域...他们是那些在所有杂志上都有关于C或C++代码的小测验的人。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接