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