参考链接:


静态代码分析:

  • 定义:不运行计算机程序的条件下,进行程序分析的方法。
  • 目的:验证代码是否满足规范性、安全性、可靠性、可维护性等指标,发现代码缺陷并提高代码的质量。
  • 范围:源代码(主要)、编译产生的字节码。
  • 常用技术:
    • 词法分析:通过正则表达式匹配将源代码转换成标记序列。
    • 语法分析:判断源程序结构上是否正确,通过使用上下文无关语法将相关符号整理为语法树。
    • 语义分析:对结构上正确的源程序进行上下文有关性质的审查。
    • 抽象语法树:将程序组织成树形结构,树中相关节点代表了程序中的相关代码。
    • 控制流分析:生成有向控制流图,用节点表示基本代码块,节点间的有向边代表控制流路径,反向边表示可能存在的循环;还可生成函数调用关系图,表示函数间的嵌套关系。
    • 无效代码分析:根据控制流图可分析孤立的节点部分为无效代码。
      数据流分析:对控制流图进行遍历,记录变量的初始化点和引用点,保存切片相关数据信息。
    • 污点分析:基于数据流图判断源代码中哪些变量可能受到攻击,是验证程序输入、识别代码表达缺陷的关键。
    • 缺陷模式匹配:缺陷模式匹配事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行模式匹配,从而完成软件的安全分析。

Java开源静态代码分析工具对比:

工具 源代码分析 字节码分析 定位 官网地址 版本 其它语言支持
Checkstyle Y 验证符合编码规则 http://checkstyle.sourceforge.net 7.8.2(2017.6.18)
FindBugs Y 发现Bugs http://findbugs.sourceforge.net 3.0.1(2015.3.6)
PMD Y 发现缺陷 https://pmd.github.io 5.8.0(2017.6.24) Y
Sonarqube Y Y 持续质量平台 https://www.sonarqube.org 6.3.1(2017.4.12) Y

PS:

1
2
3
4
5
6
7
最初Sonarqube只是做静态代码分析结果聚类展示。
后来随项目的发展,考虑到静态代码分析工具发展的不可控性(毕竟不属于自身项目),Sonarqube开始也涉及静态代码分析。
在此过程中,Sonarqube借鉴了Checkstyle、FindBugs、PMD的规则方法。
所以,本篇所指的Sonarqube既包含静态代码分析SonarJava(主要)又包含结果展示。
以上参考下面链接:
https://groups.google.com/forum/#!topic/sonarqube/9M0iZ4OILVM
https://blog.sonarsource.com/sonarqube-java-analyzer-the-only-rule-engine-you-need/

Checkstyle:

官网:检查规则

主要涉及以下几个方面:

  • 注解
  • javadoc注释
  • 命名规范
  • 文件头
  • 导入包规范
  • 尺寸设置
  • 空格
  • 正则表达式
  • 修饰符
  • 代码块
  • 编码问题
  • 类设计问题
  • 重复、度量以及一些杂项

FindBugs:

官网:检查规则

主要涉及以下几个方面:

  • Multithreaded correctness - 如多线程编程时常见的同步、线程调度问题。
  • Performance - 如由变量定义、方法调用导致的代码低效问题。
  • Internationalization - 如错误的字符串转换带来的国际化问题。
  • code vulnerabilities - 可能受到的恶意攻击,如访问权限修饰符的定义等。
  • possible bugs - 可能导致错误的代码,如空指针引用,常见代码错误,序列化错误。
  • Bad practice - 如命名不规范(类名应以大写字母开头),没有finally来关闭IO流,不检查方法返回值等。
  • Correctness - 正确性问题,如instanceof永远返回false。

PMD:

官网:Java检查规则

主要涉及以下几个方面:

  • Possible bugs - empty try/catch/finally/switch statements
  • Dead code - unused local variables, parameters and private methods
  • Suboptimal code - wasteful String/StringBuffer usage
  • Overcomplicated expressions - unnecessary if statements, for loops that could be while loops
  • Duplicate code - copied/pasted code means copied/pasted bugs

Sonarqube

官网:Java检查规则

主要涉及以下几个方面:

  • Bugs
  • Vulnerability
  • Code Smell

VS:

规则覆盖:

  • 目前Sonarqube自带的SonarJava插件检查规则几乎包含了Checkstyle、FindBugs、PMD的规则。
  • 在具体的一些问题上面,几款工具各有千秋。
  • 存在同一个问题几款工具分别对其进行不同标注情况。

结果输出展示:

  • Checkstyle、FindBugs、PMD 运行结果输出支持Xml和Html格式。
  • Sonarqube 运行结果存入数据库,web端展示。支持和上次结果对比。可视化做的很赞!

工具更新:

  • FindBugs已经很久不更新了。
  • Checkstyle、PMD、Sonarqube更新频率都挺高的。

检查范围:

  • FindBugs 只对编译产生的class文件进行检查
  • Checkstyle、PMD 只对源代码进行插件
  • Sonarqube:
    • 对于所有支持的编程语言,SonarQube 都提供源了代码的静态分析功能;
    • 对于某些特定的编程语言,SonarQube 提供了对编译后代码的静态分析功能,比如 java 中的 class file 和 jar 和 C# 中的 dll file 等;
    • 对于某些特定的编程语言,SonarQube 还可以提供对于代码的动态分析功能,比如 java 和 C# 中的单元测试的执行等。

结论:

  • 推荐使用Sonarqube来进行Java代码静态扫描。
  • 自带的SonarJava插件规则已经够用,建议直接上手使用。
  • 在使用过程中可以补充Checkstyle、FindBugs、PMD相应规则到Sonar检查。