|
程序切片是一种“影响分析”:给定某条语句的某个变量,找出影响这个变量的语句和其他变量。例如:
int foo(int a, int b) {
int c = a + 1;
int d = b + 1;
return c*d;
}
,
利用切片分析,可以知道c的取值受到参数a的影响,d的取值受到参数b的影响,返回值受到参数a和b的影响。
对于这样简单的程序,影响分析是一目了然的。但是,对于大规模程序(有非常多的函数),需要用实现了切片分析的工具来提高分析效率。此类工具往往可以标记处某条语句的变量是受哪些输入参数的影响,是通过哪条路径(语句序列)影响的。
对于软件质量保证,程序切片有如下应用:
1. 辅助程序理解。通过标记程序变量受哪些参数和语句的影响,来帮助程序员理解程序。
2. 程序重构。既然知道特定变量受哪些参数和语句影响,那么可以把这些语句和参数抽取出来,组成新的函数,即实现extract method重构方法。
3. 静态代码分析,以发现程序缺陷。
以上几条都要工具的辅助,而目前成熟的商业工具较少(这些工具还包含了许多其他的静态分析技术),应用得更少。
对于测试人员而言,程序切片的作用在于它的思想:给定某条语句的变量,要“反向”找出影响它的语句和输入参数。例如,你发现某条语句会写一个字符串到数据库,而数据库中对应的字段只能容纳16个字符,那么你就要反向读代码,一直追踪到输入框。然后,检查在这条路径上有没有对输入长度进行限制,限制得是否合理。如果没有施加有效的,那么设计一条测试用例来暴露:当用户或黑客如此输入时,程序会试图写入超过16个字符的字符串,这会导致程序异常。 |
|