【问题标题】:Static code analyzers for CC 的静态代码分析器
【发布时间】:2010-11-11 19:48:02
【问题描述】:

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

正常日常使用需要抑制多少输出?

【问题讨论】:

标签: c code-analysis


【解决方案1】:

维基百科为各种语言(包括 C)维护list of static code analysis tools

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

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

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

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


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

正如其主页所述,SourceMonitor 将:

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

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

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

【讨论】:

  • 您对 Splint 的看法非常有用,因为我正在使用支持少量 C 扩展的 Microchip C18 编译器。谢谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我们使用PC-Lint,对此非常满意。

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

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

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

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

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

    【讨论】:

      【解决方案4】:

      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 来说应该是一样的。

      【讨论】:

        【解决方案5】:

        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 会跨模块检查,而编译器只能警告编译的源文件和包含的头文件中的问题。
        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-01
          • 1970-01-01
          • 2020-07-03
          • 2011-10-11
          相关资源
          最近更新 更多