在 Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。Java 静态代码分析(static code analysis)工具能够在代码构建过程中帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省软件开发和测试成本。目前市场上的 Java 静态代码分析工具种类繁多且各有千秋,因此本文将对市面上常用工具进行分析和比较,希望能够帮助Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。
什么是静态代码分析
静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。
在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。
但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。
静态代码分析的价值
1. 代码规范问题:
代码规范类的扫描就是为了解决 “在代码里下毒” 的最有效手段。同时针对多人合作项目,如果要避免 “当我写这个代码时,只有我和上帝知道是什么意思;一个月后,只有上帝知道” 的场景,遵循统一的代码规范也是非常必要的。
2. 功能缺陷:
很多人抱有侥幸心理:“我的代码可能就这一个版本,以后不需要再维护,所以能跑就 OK 了”。那么让代码扫描来帮助确认一下,你的代码真的能跑吗?比如运行时的空指针、数组越界等问题,从这个角度来看,代码扫描等同于测试环节,是保障应用功能正常的有效手段,也能更高效地发掘出更有深度的技术问题。
3. 安全缺陷:
远程命令执行也是攻克目标机器的常用手段,许多常用的开源组件都被爆出过类似问题,你确定你的安全意识比 Apache 还要好吗?还有 CSRF、XSS、XXE、反序列化等多重攻击手段,如果每个一线程序员都需要对这些了如指掌小心避让,那管控成本将直线上升。通过代码扫描快速查找与定位风险,可以以最低成本为数字资产保驾护航。
Java 静态代码分析理论基础和主要技术
- 缺陷模式匹配:缺陷模式匹配事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行模式匹配,从而完成软件的安全分析。这种方式的优点是简单方便,但是要求内置足够多缺陷模式,且容易产生误报。
- 类型推断:类型推断技术是指通过对代码中运算对象类型进行推理,从而保证代码中每条语句都针对正确的类型执行。这种技术首先将预定义一套类型机制,包括类型等价、类型包含等推理规则,而后基于这一规则进行推理计算。类型推断可以检查代码中的类型错误,简单,高效,适合代码缺陷的快速检测。
- 模型检查:模型检验建立于有限状态自动机的概念基础之上,这一理论将被分析代码抽象为一个自动机系统,并且假设该系统是有限状态的、或者是可以通过抽象归结为有限状态。模型检验过程中,首先将被分析代码中的每条语句产生的影响抽象为一个有限状态自动机的一个状态,而后通过分析有限状态机从而达到代码分析的目的。模型检验主要适合检验程序并发等时序特性,但是对于数据值域数据类型等方面作用较弱。
- 数据流分析:数据流分析也是一种软件验证技术,这种技术通过收集代码中引用到的变量信息,从而分析变量在程序中的赋值、引用以及传递等情况。对数据流进行分析可以确定变量的定义以及在代码中被引用的情况,同时还能够检查代码数据流异常,如引用在前赋值在后、只赋值无引用等。数据流分析主要适合检验程序中的数据域特性。
由于市场上有不同的扫描工具,其对应的技术原理或多或少存在差异,下面以常用的SonarQube工具来进行具体执行原理分析。
SonarQube实现原理分析
SonarQube 是一个代码质量管理的开源平台,通过 SonarQube 提供的代码扫描、质量阈值卡点等质量红线,我们可以进行静态代码扫描分析,进而提前捕获和提示代码中的错误,从而避免未定义的行为影响到用户,保证业务质量,也能确保管理的代码库干净并且可维护,以便提高开发人员的开发效率。
SonarQube工作流程包含3个组件:
其中:
Scanner:扫描器,负责将源文件进行代码分析,并将分析后的报告发送给SonarQube服务器。
SonarQube Server:SonarQube服务器,负责处理分析报告,后台管理等。
Database server:数据库服务器,负责存储数据。