选择一个静态代码分析工具

我正在研究一个项目,我在UNIX环境中使用C语言进行编码。我一直在使用lint工具来检查我的源代码。林特已经很长时间(自1979年以来),任何人都可以提出一个我可以使用的更新的代码分析工具吗?最好是免费的工具。

0
额外
意见: 1
另见什么是最好的命令行清理代码的工具针对C 。如果您的原型正确地集中在头文件中并在任何地方使用,那么 lint 所做的跨文件检查也由编译器完成(尽管每次只有一个文件)。
额外 作者 Jonathan Leffler,
投票结束,作为工具rec。
额外 作者 Ciro Santilli 包子露宪 六四事件 法轮功,

15 答案

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

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

0
额外
@nwp,我不会说它很贵。在单座成本1000美元(unix)或400美元(窗口)的情况下,它可能为一个客户问题付出代价。
额外 作者 Mark Harrison,
Flexelint是可笑的昂贵。
额外 作者 nwp,

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

根据我的理解,它不仅仅是语法分析。例如,“自动查找错误”。

0
额外

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

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

[剪断] </强>

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

0
额外
对于现有的代码库,-Weffc ++具有太多的“混乱”警告,以便与-Werror结合使用。
额外 作者 Tom,

lint is constantly updated... so why would you want a more recent one.

BTW flexelint lint

0
额外
FlexeLint是一款商业产品,与Johnson的原始Unix Lint AFAIK没有任何共同的发展历史。一个非商业的替代品是Splint。
额外 作者 Chris Conway,

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

我正在努力公开发布一个后继工具, OrionCONTENT NOT AVAILABLE ANYMORE

0
额外

类似皮毛的工具通常会遭受“虚惊”问题:他们报告的问题比真实存在的要多得多。如果真正有用的警告的比例太低,用户学会忽略该工具。更现代的工具花费一些精力来关注最有可能/有趣的警告。

0
额外

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

这不是一个免费的工具(尽管我相信他们提供对开源项目的免费扫描),但它是您找到的最好的静态分析工具之一。我听说C在C ++上比C ++更令人印象深刻,但它帮助我们避免了很多错误。

0
额外

天儿真好,

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

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

但是,它不会取代有人通过您的代码阅读知识的人。正如大卫在他的网页上所说:“一个带着工具的傻瓜仍然是一个傻瓜!”

干杯,

0
额外

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

0
额外
为夹板+1,优秀的工具和免费(如在言论自由,而不是免费的啤酒)
额外 作者 bortzmeyer,
这个术语的含义都是免费的。
额外 作者 sebnow,

不要忽视编译器本身。

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

另外请确保告诉编译器处理错误等警告,以便您立即修复它们。 (gcc上的“ - 错误”)

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

还有:检查valgrind(免费!) - 它“能够自动检测许多内存管理和线程错误,并详细描述您的程序。”

Valgrind isn't a static checker, but it's a great tool! http://valgrind.org

0
额外
这是如何被接受的答案?如果我想检查资源安全,如锁定/解锁,该怎么办?编译器不能做任何事情。而valgrind是动态代码分析...
额外 作者 UmNyobe,

PC-lint/Flexelint are very powerful and useful static analysis tools, and highly configurable, though sadly not free.

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

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

正因为如此,我更喜欢Lint这类运行速度相对较快的工具,因此鼓励持续使用,而不是使用较不经常使用的更麻烦的工具(如果有的话)。

0
额外

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

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

0
额外

Sparse is a computer software tool, already available on Linux, designed to find possible coding faults in the Linux kernel.

有两个 Linux验证中心的活动项目旨在提高可加载内核模块的质量。

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

You can use cppcheck. It is an easy to use static code analysis tool.
For example:
cppcheck --enable=all .
will check all C/C++ files under the current folder.

0
额外

You can try CppDepend, a pretty complete static analyzer available on windows and linux, throught VS Plugin, IDE or command line, and it's free for open source contributors

0
额外