【背景】
静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。
【收益】
1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。
2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。
3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。
【主要技术总结】
1. 缺陷模式匹配: 工具富集大量缺陷模式,通过将代码与缺陷模式进行匹配。要求富集大量共性缺陷模式,往往误报的情况比较多。
2. 类型推断:类型推断技术是指通过对代码中的运算对象类型进行推理,从而保证每条语句都针对正确的类型去计算。这种技术需要提前定义一套类型机制,包括类型等价、类型包含等推理关系,而后基于这些规则进行计算。此种技术可以检验代码中的类型错误。
3. 模型检查:模型检验是指将代码中每条语句产生的影响抽象成一个有限状态自动机的一个状态,而后通过分析有限状态机从而打到分析代码的目的。模型检验主要是用于检验程序并发等时序特性,但是对于数据值域数据类型等方面作用较弱。
4. 数据流分析:通过收集代码中引用到的变量信息,从而分析变量在程序中的赋值、传递以及引用等情况。
【常用的静态代码扫描工具分类】
Java静态分析工具 分析对象 应用技术 原理描述 内置编码规范 CheckStyle Java源代码 缺陷模式匹配 是 SourceForge 的开源项目,通过检查对代码编码格式,命名约定,Javadoc,类设计等方面进行代码规范和风格的检查 Javadoc 注释:检查类及方法的 Javadoc 注释命名约定:检查命名是否符合命名规范标题:检查文件是否以某些行开头Import 语句:检查 Import 语句是否符合定义规范代码块大小,即检查类、方法等代码块的行数空白:检查空白符,如 tab,回车符等修饰符:修饰符号的检查,如修饰符的定义顺序块:检查是否有空块或无效块代码问题:检查重复代码,条件判断,模数等问题类设计:检查类的定义是否符合规范,如构造函数的定义等问题 FindBugs 字节码 缺陷模式匹配;数据流分析 FindBugs 通过检查类文件或 JAR 文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析。 Bad practice 坏的实践:常见代码错误,用于静态代码检查时进行缺陷模式匹配Correctness 可能导致错误的代码,如空指针引用等国际化相关问题:如错误的字符串转换可能受到的恶意攻击,如访问权限修饰符的定义等多线程的正确性:如多线程编程时常见的同步,线程调度问题。运行时性能问题:如由于变量定义,方法调用导致的代码低效问题。 PMD Java源代码 缺陷模式匹配 PMD 通过其内置的编码规则对 Java 代码进行静态检查,主要包括对潜在的 bug,未使用的代码,重复的代码,循环体创建新对象等问题的检验。 可能的 Bugs:检查潜在代码错误,如空 try/catch/finally/switch 语句未使用代码(Dead code):检查未使用的变量,参数,方法复杂的表达式:检查不必要的 if 语句,可被 while 替代的 for 循环重复的代码:检查重复的代码循环体创建新对象:检查在循环体内实例化新对象资源关闭:检查 Connect,Result,Statement 等资源使用之后是否被关闭掉 Jtest Java源代码 缺陷模式匹配;数据流分析 Jtest 的静态代码分析功能能够按照其内置的超过 800 条的 Java 编码规范自动检查并纠正这些隐蔽且难以修复的编码错误。 可能的错误:如内存破坏、内存泄露、指针错误、库错误、逻辑错误和算法错误等未使用代码:检查未使用的变量,参数,方法初始化错误:内存分配错误、变量初始化错误、变量定义冲突命名约定:检查命名是否符合命名规范Javadoc 注释:检查类及方法的 Javadoc 注释线程和同步:检验多线程编程时常见的同步,线程调度问题国际化问题:垃圾回收:检查变量及 JDBC 资源是否存在内存泄露隐患