静态代码扫描原理和常见工具
静态代码扫描价值
(1)研发过程,发现BUG越晚,修复的成本越大;
(2)缺陷引入的大部分是在编码阶段,但发现的更多是在单元测试、集成测试、功能测试阶段;
(3)统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。
目标:希望在编码阶段发现更多问题。(静态代码扫描、code review)
静态代码分析理论基础和主要技术
静态代码分析原理分为两种:分析源代码编译后的中间文件(如Java的字节码);分析源文件。主要分析技术如下:
-
缺陷模式匹配
- 事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行匹配,从而完成软件安全分析。优点:简单方便;缺点:需要内置足够多的缺陷模式,容易产生误报。
-
类型推断/类型推断
- 类型推断技术是指通过对代码中运算对象类型进行推理,从而保证代码中每条语句都针对正确的类型执行。
-
模型检查
- 建立于有限状态自动机的概念基础上。将每条语句产生的影响抽象为有限状态自动机的一个状态,再通过分析有限状态机达到分析代码目的。
- 校验程序并发等时序特性。
-
数据流分析
- 从程序代码中收集程序语义信息,抽象成控制流图,可以通过控制流图,不必真实的运行程序,可以分析发现程序运行时的行为。
静态代码扫描工具/引擎对比
序号 | 引擎 | 分析对象 | 备注 |
---|---|---|---|
1 | Findbugs | 字节码 | 缺陷模式匹配、数据流分析。通过字节码分析代码存在缺陷、支持数据流分析,能查找出空指针崩溃等问题。 |
2 | CheckStyle | Java源文件 | 缺陷模式匹配。扫描代码格式规范、代码风格的工具。 |
3 | Godeyes | ~ | 百度出品,主要针对Android代码。 |
4 | Lint | Java源代码 | Android官方提供的代码分析工具,可以扫描出API兼容性问题、布局性能等针对Android代码的潜在缺陷。 |
5 | PMD | Java源代码 | 缺陷模式匹配、数据流分析。检测代码潜在错误。 |