【问题标题】:What static analyzers do you make a point of running on Java code, and why?您认为在 Java 代码上运行哪些静态分析器,为什么?
【发布时间】:2010-05-13 14:51:03
【问题描述】:

我已经尝试了几种不同的 Java 静态分析器,特别是 Findbugs 和 PMD。

我正在寻找可能值得在 Java 代码上运行的其他静态分析器的示例。

【问题讨论】:

  • 我现在有两个建议 Findbugs 的答案,我必须承认它看起来确实不错。这是普遍共识吗?

标签: java static-analysis


【解决方案1】:

FindBugsPMD旁边,还有BanderaESC/JavaJLint。您可以找到它们的比较here (PDF)。以下是相关性摘录:

错误类别 - 示例 |电调 |查找错误 |林特 | PMD -------------------------------------------------- +-----+----------+--------+------ 常规 - Null 取消引用 |五 |五 |五 |五 并发 - 可能的死锁 |五 |五 |五 |五 异常 - 可能的意外异常 |五 | | | 数组 - 长度可能小于零 |五 | |五 | 数学- 除以零|五 | |五 | 条件,循环 - 无法访问的代码 | |五 | |五 字符串 - 使用 == 或 != | 检查相等性|五 |五 |五 对象覆盖 - 相等对象/相等哈希码 | |五 |五 |五 I/O 流 - 流未在所有路径上关闭 | |五 | | 未使用或重复的语句 - 未使用的本地 | |五 | |五 设计——应该是一个静态内部类| |五 | | 不必要的声明 - 不必要的退货 | | | |五

注意:文章是2004年的文章,工具可能同时改进了。

如您所见,FindBugs 和 PMD 的发现非常多,也是最流行的静态分析器工具。但是,现在智能 IDE 也涵盖了某些方面,例如 null 尊重、未使用的本地和无法访问的代码。例如 Eclipse 可以对它们发出警告。

【讨论】:

  • Checkstyle 也很棒,它不仅仅是检查你的代码是否符合某种风格——不应该被排除在任何列表之外
  • Checkstyle 更像是一个风格检查器,而不是一个逻辑检查器。但确实,这也是值得的。
  • 您能否在此工具列表中为 Contemplate 的 Threadsafe 添加一些上下文?我知道这个工具,它专门研究并发漏洞和错误,但我不知道它有多好,所以我个人有兴趣看到它。另外,我不能给这个答案一个赞成票,因为它非常肤浅。它没有提到假阳性/阴性率,只是给出了一个“复选标记”来表示它检测到了某些东西。考虑是个人要求,但除此之外,这对于静态分析来说是一个糟糕的答案。
【解决方案2】:

Findbugs 几乎是标准,因为它非常健壮(对于从研究开始的工具)、定期维护,并且最新版本确实涵盖了大部分基础。它还具有出色的 Eclipse 集成以及各种过滤和排序选项,可让您获得首选的信噪比。

我唯一的愿望是它可以提供建议的工作流程,因此我可以选择忽略特定实例(例如,对于我无法控制的代码)而只查看更改。当我有备用核心时,持续分析也很好。

我熟悉一些非常有前途的研究工具,它们使用静态分析来检查 API 一致性或线程分析。不幸的是,它们都不是真正的生产质量,它们需要开发商方面的一些投资。

【讨论】:

    【解决方案3】:

    这里有java静态分析工具列表:http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#Java

    Findbugs 是我个人的最爱,因为它易于使用的界面和全面的分析,另外还有 eclipse 和 idea 的插件。

    【讨论】:

      【解决方案4】:

      我建议您使用 IntelliJ 中的代码分析器。它有 600 多项易于打开和关闭的检查,但主要原因是许多检查都有快速修复。

      如果您只是生成报告,您可能会发现 1000 或 10,000 多个已标记的问题。当每个问题通常没有什么价值但存在引入错误的真正风险时,解决这个问题可能会很乏味。不过,IntelliJ 可让您在几分钟内选择并修复 1000 多个问题,同时大大降低了引入错误的风险。

      IntelliJ CE 是开源和免费的,并且具有此功能。

      【讨论】:

        【解决方案5】:

        This page 有一些开源代码分析器的列表(带有小描述)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多