关于C#:选择静态代码分析工具

Choosing a static code analysis tool

我正在一个项目中,我正在UNIX环境中用C进行编码。 我一直在使用棉绒工具检查我的源代码。 Lint已有很长时间了(自1979年以来),有人可以建议我使用一个较新的代码分析工具吗? 优选地,工具是免费的。


不要忽略编译器本身。

阅读编译器的文档,找到它可以提供的所有警告和错误,然后为您启用尽可能多的警告和错误。

另外,请确保告诉编译器将警告视为错误,这样您就必须立即修复它们。 (gcc上的" -Werror")

另外:gcc上的" -Wall"不会启用所有警告,请不要上当。

还可以:检出valgrind(免费!)-它"自动检测许多内存管理和线程错误,并详细分析程序"。

Valgrind不是静态检查器,但是它是一个很棒的工具! http://valgrind.org


对于C代码,您绝对应该使用Flexelint。我使用了将近15年并发誓。它真正的强大功能之一是可以通过代码中的注释(" / * lint -e123 * /")有选择地关闭和打开警告。当您想要与众不同的东西时,它证明是强大的文档工具。"我正在关闭警告X,因此,有充分的理由我正在执行X。"

对于任何遇到有趣的C / C ++问题的人,请在其网站上查看他们的一些示例,看看是否可以在不查看提示的情况下找出错误。


我听说过有关clang静态分析器的好消息,IIRC使用LLVM作为后端。如果在您的平台上实现,那将是一个不错的选择。

据我了解,它所做的不只是语法分析。例如,"自动错误查找"。


您可以使用cppcheck。这是一种易于使用的静态代码分析工具。
例如:
cppcheck --enable=all .
将检查当前文件夹下的所有C / C ++文件。


我最近整理了一份可供我使用的所有静态分析工具的清单,但我仍在评估所有工具。请注意,这些大多是安全性分析工具。

  • 夹板
  • 老鼠
  • SMATCH
  • 宇野


我们一直在使用Coverity Prevent检出C ++源代码。

它不是一个免费工具(尽管我相信它们可以为开源项目提供免费扫描),但却是您发现的最佳静态分析工具之一。我听说它在C上比在C ++上印象更深刻,但是到目前为止,它帮助我们避免了很多错误。


您可以尝试CppDepend,这是一个相当完整的静态分析器,可通过VS插件,IDE或命令行在Windows和Linux上使用,并且对开源贡献者免费。


PC-lint / Flexelint是非常强大和有用的静态分析工具,并且高度可配置,尽管遗憾的是它不是免费的。

初次使用此类工具时,它们会产生大量警告,这使得很难区分主要警告和次要警告。因此,最好尽早在项目中开始在代码上使用该工具,然后在代码上尽可能多地运行它,以便您可以在出现新警告时对其进行处理。

通过这样的连续使用,您很快就会学习如何以确认工具所应用规则的方式编写代码。

因此,我更喜欢像Lint这样的工具,它们运行速度相对较快,因此鼓励持续使用,而不是使用那些笨拙的工具(如果有的话,它们可能会减少使用的频率)。


像棉绒一样的工具通常会遇到"错误警报"问题:它们报告的问题比实际存在的问题多得多。如果真正有用的警告比例太低,则用户将学会忽略该工具。更多现代工具花费了一些精力来关注最可能/最有趣的警告。


您可能会发现Uno工具很有用。这是为数不多的免费非玩具选择之一。它与lint,Flexelint等不同,其重点在于少量的"语义"错误(空指针解引用,越界数组索引和未初始化变量的使用)。它还允许用户定义检查,例如锁定-解锁规则。

我正在努力公开发布后继工具 Orion (不再提供任何内容)


Sparse是一种计算机软件工具,已在Linux上提供,用于在Linux内核中查找可能的编码错误。

Linux Verification Center有两个活动的项目,目的是提高可加载内核模块的质量。

  • Linux驱动程序验证(LDV)-用于对Linux设备驱动程序进行静态源代码验证的综合工具集。
  • KEDR Framework-用于内核模块动态分析和验证的可扩展框架。
  • 另一个正在进行的项目是Linux文件系统验证,旨在开发专用工具集来验证Linux文件系统实现。

  • 我发现通常最好使用多个静态分析工具来查找错误。每个工具的设计都不同,它们可以找到彼此完全不同的东西。

    这里的一些谈话中有一些很好的讨论。它来自美国国土安全部召开的关于静态分析的会议。


    G'day,

    我完全同意在设置-Wall之后阅读和摘要编译器告诉您的内容的建议。

    David Wheeler编写的FlawFinder是一个很好的安全性静态分析工具。寻找各种安全漏洞利用非常出色,

    但是,这并不能代替让一个知识渊博的人阅读您的代码。正如David在他的网页上说的:"傻瓜仍然是傻瓜!"

    干杯,


    皮棉不断更新...所以,为什么要更新一个呢?

    BTW flexelint是皮棉


    gcc有一个" -Weffc ++"选项,根据Mac OS X手册页,该选项将:

    Warn about violations of the following style guidelines from Scott Meyers' Effective C++ book:

    [片段]

    我知道您问过C,但这是我所知道的最接近的。