2008-08-05 189 views
54

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

+1

也请参阅[什么是最好的命令行工具清理代码](http://stackoverflow.com/questions/393208/what-is-the-best-command-line-tool-to-clean-up-code/)和[C建议的GCC警告选项] (http://stackoverflow.com/questions/154630/recommended-gcc-warning-options-for-c)。如果你的原型正确地集中在头文件中,并在任何地方使用,那么`lint`所做的跨文件检查也是由编译器完成的(尽管每次只有一个文件)。 – 2012-03-05 06:30:55

+0

投票结束,作为工具rec。 – 2015-07-02 12:16:35

+0

PVS-Studio分析仪现在可用于Linux - http://www.viva64.com/en/b/0441/ – 2016-11-06 20:23:47

回答

29

不要忽视编译器本身。

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

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

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

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

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

14

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

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

+8

Flexelint的价格非常贵。 – nwp 2014-06-05 13:21:57

+2

@nwp,我不会说它很贵。在单座成本1000美元(unix)或400美元(窗口)的情况下,它可能为一个客户问题付出代价。 – 2014-06-05 19:20:28

+0

@MarkHarrison:我可以在线使用吗? – 2014-07-22 19:02:21

12

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

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

5

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

0

有一个“-WeffC++”选项GCC有根据Mac OS X的手册页将:

发出警告从斯科特迈尔斯有效的C++的书违反了以下风格指南:

[剪断]

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

1

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

我向继任者工具的公开发行工作, Orion 内容不再可用

0

皮棉不断更新中...为什么你会希望有一个更近的一个。

BTW flexelint 皮棉

1

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

0

天儿真好,

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

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

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

欢呼声,

罗布

5

我最近编制了所有的静态分析工具我有我的处置名单,我仍然在评估他们所有的过程。请注意,这些主要是安全分析工具。

1

PC-lint/Flexelint是非常强大和有用的静态分析工具,以及高度可配置的,但可惜不是免费的。

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

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

正因为如此,我更喜欢之类的工具,其相对快速运行皮棉,所以鼓励继续使用,而不是你最终可能会使用较少的较笨重的工具,如果在所有。

0

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

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

0

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

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

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

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