选择静态代码分析工具

时间:2008-08-05 21:19:41

标签: c unix testing

我正在开发一个项目,我在UNIX环境中用C编码。我一直在使用lint工具来检查我的源代码。 Lint已经存在了很长时间(自1979年以来),任何人都可以建议我可以使用更新的代码分析工具吗?最好是免费的工具。

15 个答案:

答案 0 :(得分:31)

不要忽视编译器本身。

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

还要确保告诉编译器处理错误等警告,这样您就不得不立即修复它们。 (gcc上的“-Werror”)

另外:gcc上的“-Wall”启用所有警告,不要被愚弄。

另外:查看valgrind(免费!) - 它“自动检测[s]许多内存管理和线程错误,并详细介绍您的程序。”

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

答案 1 :(得分:15)

对于C代码,绝对应该使用Flexelint。我用了将近15年,并发誓。其中一个非常棒的功能是可以通过代码中的注释(“/ * lint -e123 * /”)有选择地关闭和打开警告。当你想要一些与众不同的东西时,这就成了一个强大的文档工具。 “我正在关闭警告X,因此,有一个很好的理由我正在做X.”

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

答案 2 :(得分:12)

我听说过有关clang static analyzer的好消息,IIRC使用LLVM作为它的后端。如果在您的平台上实现,那可能是一个不错的选择。

据我所知,它不仅仅是语法分析。例如,“自动寻找错误”。

答案 3 :(得分:5)

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

答案 4 :(得分:5)

我最近编制了一份我所拥有的所有静态分析工具的清单,我仍然在评估它们。请注意,这些主要是安全分析工具。

答案 5 :(得分:5)

我们一直在使用Coverity Prevent查看C ++源代码。

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

答案 6 :(得分:1)

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

我正在努力公开发布后续工具 Orion 内容无法提供任何内容

答案 7 :(得分:1)

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

当第一次使用这样的工具时,它们会产生大量的警告,这使得很难区分主要和次要的警告。因此,最好尽可能在项目早期开始在代码上使用该工具,然后尽可能经常在代码上运行它,以便在出现时能够处理新的警告。

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

因此,我更喜欢像Lint这样运行相对较快的工具,因此鼓励持续使用,而不是使用较少繁琐的工具,如果有的话,可能不会经常使用。

答案 8 :(得分:1)

你可以试试CppDepend,这是一个非常完整的静态分析器,可以通过VS插件,IDE或命令行在Windows和Linux上使用,它可以免费用于open source contributors

答案 9 :(得分:1)

类似于Lint的工具通常会遇到“误报”问题:他们报告的问题比实际存在的问题多得多。如果真正有用的警告的比例太低,则用户学会忽略该工具。更现代的工具花费了一些精力来关注最有可能/最有趣的警告。

答案 10 :(得分:0)

根据Mac OS X手册页,gcc有一个“-Weffc ++”选项:

  

警告Scott Meyers的Effective C ++书籍违反以下风格指南:

<强> [剪断]

我知道你问过C,但这是我最接近的......

答案 11 :(得分:0)

lint 会不断更新...所以为什么你想要一个更新的。

BTW flexelint lint

答案 12 :(得分:0)

天儿真好,

我完全同意在设置-Wall之后阅读和消化编译器告诉你的建议。

安全性良好的静态分析工具是由David Wheeler编写的FlawFinder。它在寻找各种安全漏洞方面做得很好,

但是,它并不能取代知识渊博的人阅读您的代码。正如大卫在他的网页上所说,“傻瓜用工具仍然是个傻瓜!”

欢呼声,

罗布

答案 13 :(得分:0)

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

在一些会谈中有一些很好的讨论here。这是美国国土安全部举行的关于静态分析的会议。

答案 14 :(得分:0)

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

Linux Verification Center有两个活跃的项目旨在提高可加载内核模块的质量。

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