一 背景
1.软件开发过程中,工程师需要花费大量的时间和精力修改代码缺陷。从下图可以看出,在软件开发过程中,测试成本随着设计构建、QA、系统集成阶段的发展在不断增加。因此工程师应该努力在设计开发阶段优化代码、定位修复代码缺陷,这样可以节省大量时间和人力成本。
2.代码review是代码质量保证的很重要一环,但是人力review精力有限,我们应该尽量使用工具完成基础代码逻辑的review工作,teamleader可以将精力更多放在代码设计和代码核心逻辑上面。这样既可以改善代码质量,也可以提高协同开发的效率。

二 原理
2.1 抽象语法树
【代码[静态分析](Program Static Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术】
这里面提到的词法、语法分析,是通过解析代码文件并转换成抽象语法树实现。
抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。和抽象语法树相对的是具体语法树(concrete syntaxtree),通常称作分析树(parse tree)。一般的,在源代码的翻译和编译过程中,语法分析器创建出分析树。一旦AST被创建出来,在后续的处理过程中,比如语义分析阶段,会添加一些信息。
比如下图展示了Helloworld.java的AST:

2.2 静态分析类型
代码静态分析实现原理分为两种。一种是分析源代码编译后的中间文件(比如JAVA语言的字节码),一种是分析源文件。
静态代码分析技术主要有:
缺陷模式匹配 : 缺陷模式匹配事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行模式匹配,从而完成软件的安全分析。这种方式的优点是简单方便,但是要求内置足够多缺陷模式,且容易产生误报。
类型检查 :类型推断技术是指通过对代码中运算对象类型进行推理,从而保证代码中每条语句都针对正确的类型执行。这种技术首先将预定义一套类型机制,包括类型等价、类型包含等推理规则,而后基于这一规则进行推理计算。类型推断可以检查代码中的类型错误,简单,高效,适合代码缺陷的快速检测。
数据流分析:数据流分析也是一种软件验证技术,这种技术通过收集代码中引用到的变量信息,从而分析变量在程序中的赋值、引用以及传递等情况。对数据流进行分析可以确定变量的定义以及在代码中被引用的情况,同时还能够检查代码数据流异常,如引用在前赋值在后、只赋值无引用等。数据流分析主要适合检验程序中的数据域特性。
2.3 Android lint AST Parser
自从ADT 16第一次引入Android Lint(以下简称:Lint)以来,Lint便成为Android平台上最重要的静态代码扫描工具。与早期基于XPath的静态扫描工具不同,Lint基于AST(Abstract Syntax Tree)进行分析,可以用来定制很复杂的扫描规则。
Lint从第一个版本就选择了lombok-ast作为自己的AST Parser,并且用了很久。但是Java语言本身在不断更新,Android也在不断迭代出新,lombok-ast慢慢跟不上发展,所以Lint在25.2.0版增加了IntelliJ的PSI(Program Structure Interface)作为新的AST Parser。但是PSI于IntelliJ、于Lint也只是个过渡性方案,事实上IntelliJ早已开始了新一代AST Parser,UAST(Unified AST)的开发,而Lint也将于即将发布的25.4.0版中将PSI更新为UAST。
三 AS静态代码分析工具
Analyze是AS内置的代码分析工具,主要包括:
- Inspect C

最低0.47元/天 解锁文章
340





