这个关于Cyclomatic Complexity的问题让我对静态代码分析有了更多的思考。分析代码复杂性和一致性有时很有用,我想开始做更多。您推荐哪些工具(每种语言)进行此类分析? 维基百科有很多工具,但人们以前尝试过哪些工具?
编辑:正如 David 所指出的,对于基于 C/UNIX 的工具,这不是一个完全没有被问到的问题。
这个关于Cyclomatic Complexity的问题让我对静态代码分析有了更多的思考。分析代码复杂性和一致性有时很有用,我想开始做更多。您推荐哪些工具(每种语言)进行此类分析? 维基百科有很多工具,但人们以前尝试过哪些工具?
编辑:正如 David 所指出的,对于基于 C/UNIX 的工具,这不是一个完全没有被问到的问题。
我一直在为我的 Objective-C iPhone 项目(iOS 应用程序)建立一个 Hudson 持续集成 (CI) 构建系统,并编制了一系列可用于在构建期间分析我的项目的工具:
Clang 静态分析器:免费、最新的独立工具,它比 Xcode 4 中包含的 Clang 版本捕获更多问题。活动项目。-- 访问http://clang-analyzer.llvm.org
Doxygen:免费的文档生成工具,还可以生成类依赖关系图。活跃项目——访问http://www.doxygen.nl
HFCCA(无头圈复杂度分析器):用于计算代码复杂度的免费 Python 脚本,但没有头文件和预处理器。支持 Hudson/Jenkins 构建的 XML 格式输出。活跃的项目。-- 访问http://code.google.com/p/headerfile-free-cyclomatic-complexity-analyzer
CLOC (count lines of code):免费工具来计算文件、代码行、注释和空白行。支持差异化,因此您可以看到构建之间的差异。活跃的项目。-- 访问http://cloc.sourceforge.net
SLOCcount(源代码行数):一个免费工具,用于计算代码行数并估算与项目相关的成本和时间。似乎不活跃。-- 访问http://sourceforge.net/projects/sloccount和http://www.dwheeler.com/sloccount
AnalysisTool:免费的代码分析工具,可测量代码复杂性并生成依赖关系图。不活跃。似乎不适用于 Xcode 4,但我很想让它工作。-- 访问http://www.karppinen.fi/analysistool
对于 C++,我使用 CppCheck。它似乎工作正常。
Checkstyle、Findbugs 和 PMD 在 Java 中都能很好地工作。我目前对在 NetBeans 中运行 PMD 非常满意。它有一个相当简单的 GUI,用于管理您想要运行的规则。在一个文件、整个包或整个项目上运行检查器也非常容易。
显然,答案取决于编程语言。UNO适用于 C 程序。
@Thomas Owens:我认为您的意思是夹板。
我经常使用 Eclipse 的 PMD 插件。它非常好,而且非常可配置。CheckStyle 也很好,如果你正在寻找更多的风格执行者。
Lint是我在以前的职位上使用过的唯一一种。还不错,它建议的大部分内容都是很好的捕获物,有些没有多大意义。只要您没有适当的流程来确保没有 lint 错误或警告,那么捕获一些其他隐藏的错误可能会很有用
我们在 Palm 使用Coverity Prevent进行 C 和 C++ 代码分析,它在发现我们代码中的一些隐藏错误方面做得很好。它还发现了很多不太可能被命中的问题,但很容易在工具生成的代码数据库中将它们标记为“不会修复”或“不是问题”。它很昂贵,但该公司偶尔会在开源项目上运行并向维护人员提供报告。如果您想了解更多关于我们的经验,他们会在他们的网站上有一份关于我们使用该产品的白皮书。
我们将 Programming Research 的QAC用于我们的 C 代码。工作正常。
最近我们一直在讨论检查一些更高级的静态/动态代码分析器,例如 Coverity 的Prevent或GrammaTech的分析工具。
他们声称不仅可以进行静态分析,还可以发现运行时错误等。一个主要卖点应该是更少的误报。
我的管理员真的很便宜,所以我只能使用非常便宜的工具:
1) CCCC (C/C++ 代码计数器):与行数相关的各种结果(与注释行数、圈复杂度、信息流......) 2) Semian:我试过的最快的代码重复查找器。3) LOC Metrix:不是很有用,但可以帮助说明问题。
我唯一一次使用过这些工具之一是Split(C 编程语言)。我认为它很有帮助,但我绝不是一个超级用户,我想我几乎没有触及它可以做什么的表面。
我已经在多种语言中使用了相当多的开源和商业静态分析工具,并且我发现整体讨论适合被称为技术债务的概念(本文详细介绍)。
然而,为了快速回答,这里是我最喜欢的每种语言: