程序静态分析
通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。目前静态分析技术向模拟执行的技术发展以能够发现更多传统意义上动态测试才能发现的缺陷,例如符号执行、抽象解释、值依赖分析等等并采用数学约束求解工具进行路径约减或者可达性分析以减少误报增加效率。
词法分析:从左至右一个字符一个字符的读入源程序,对构成源程序的字符流进行扫描,通过使用正则表达式匹配方法将源代码转换为等价的符号(Token)流,生成相关符号列表,Lex为常用词法分析工具。
语法分析:判断源程序结构上是否正确,通过使用上下文无关语法将相关符号整理为语法树, Yacc为常用工具。
抽象语法树分析:将程序组织成树形结构,树中相关节点代表了程序中的相关代码,目前已有javacc/ Antlra等抽象语法树生成工具。
语义分析:对结构上正确的源程序进行上下文有关性质的审查。
控制流分析:生成有向控制流图,用节点表示基本代码块,节点间的有向边代表控制流路径,反向边表示可能存在的循环;还可生成函数调用关系图,表示函数间的嵌套关系。
数据流分析:对控制流图进行遍历,记录变量的初始化点和引用点,保存切片相关数据信息。
污点分析:基于数据流图判断源代码中哪些变量可能受到攻击,是验证程序输入、识别代码表达缺陷的关键。
无效代码分析:根据控制流图可分析孤立的节点部分为无效代码。
注:
Lex是LEXical compiler的缩写,是Unix环境下非常著名的工具,主要功能是生成一个词法分析器(scanner)的C源码,描述规则采用正则表达式(regular expression)。
yacc(Yet Another Compiler Compiler),是一个经典的生成语法分析器的工具。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。
JavaCC(Java Compiler Compiler)是一个用JAVA开发的受欢迎的语法分析生成器。这个分析生成器工具可以读取上下文无关且有着特殊意义的语法并把它转换成可以识别且匹配该语法的JAVA程序。
程序动态分析
使程序有控制地运行,并从多种角度观察程序运行时的行为。可以用一些自动工具来记录、监视、统计程序的运行情况,最典型的方法是在被测程序的某些位置插入一些装置,程序运行时,这些装置就能发挥监视作用,运行结束后,它们就能对测试情况作出报告。
区别
动态分析是通过在真实或模拟环境中执行程序进行分析的方法,多用于性能测试、功能测试、内存泄漏测试等方面。与之相反,静态分析不运行代码只是通过对代码的静态扫描对程序进行分析。
执行速度快、效率高。
误报率高。
代码检测工具
1、findbugs
FindBugs通过检查类文件或 JAR文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析。Findbugs有两种工具形式,一种是界面形式另一个是插件形式,能够在liunx上部署,为了使用方便很多使用插件与eclipse结合使用的形式,findbugs的安装、使用可以到此查看http://www.onstepr.com/posts/31
2、infer
Facebook 的 Infer 是一个静态分析工具。Infer 可以分析 Objective-C, Java 或者 C 代码,报告潜在的问题。任何人都可以使用 Infer 检测应用,这可以将那些严重的 bug 扼杀在发布之前,同时防止应用崩溃和性能低下。
安装及使用请查看http://www.onstepr.com/posts/45
3、PMD
开源。许多可以直接使用的规则,利用这些规则可以找出Java源程序的问题,例如:
潜在的bug:空的try/catch/finally/switch语句
未使用的代码:未使用的局部变量、参数、私有方法等
可选的代码:String/StringBuffer的滥用
复杂的表达式:不必须的if语句、可以使用while循环完成的for循环
重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
循环体创建新对象:尽量不要再for或while循环体内实例化一个新对象
资源关闭:Connect,Result,Statement等使用之后确保关闭掉
此外,用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。
4、Wala
开源,能够静态分析java和javascript。
Java类型系统和类层次结构分析
源语言框架,支持Java和JavaScript
过程间数据流分析
上下文敏感的基于制表限幅器
指针分析,调用图
基于SSA寄存器传输语言IR
迭代数据流总体框架
一般分析效用和数据结构
字节码仪器库和Java的动态加载时仪器库
http://wala.sourceforge.net/wiki/index.php/Main_Page
5、Lint4j
对Java源码和字节码进行静态分析,判断其中是否存在死锁、性能问题或者伸缩性问题。
检测代码语法规则
潜在的bug
检测编码模式对代码可读性及大小的影响
检测是否违反EJB规范
http://www.jutils.com/eclipse/
6、CheckStyle
SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。
CheckStyle检验的主要内容
Javadoc注释
命名约定
标题
Import语句
体积大小
空白
修饰符
块
代码问题
类设计
混合检查(包括一些有用的比如非必须的System.out和printstackTrace)
CheckStyle提供了大部分功能都是对于代码规范的检查,而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能,更强调代码规范。