符号执行与测试用例生成技术解析
1. 符号执行概述
符号执行是一种诞生于20世纪70年代的程序验证技术。它介于非正式和正式的验证方法之间。非正式方法是开发者创建测试用例,将输入值提供给应用程序,运行后将测试结果与预期结果进行正确性比对;而正式方法则是用规范语言描述应用程序,再通过证明过程来证明程序按预期执行。非正式方法需要实际执行应用程序,正式方法甚至可以在系统原型存在之前应用。
符号执行的出现填补了这两种技术之间的空白。它主要用于探索应用程序可能的执行路径,与使用样本输入值的非正式测试不同,符号执行的输入是代表一类值的符号。例如,若应用程序期望一个数值,会传入一个代表所有数值集合的通用符号 x ,执行的输出将是输入符号的函数。
由于符号执行是对未定义的值进行的,所覆盖的控制路径需要在运行时通过启发式方法或人工来定义。特别是条件结构的符号执行很关键,当评估一个符号条件时,结果可能为真、假或无法判定。若为真或假,能明确应遵循的控制路径;若无法明确判定条件分支,则程序的符号执行会分裂为两条路径。每个可能的程序控制路径都对应着执行过程中决策积累的条件合取,定义控制路径的条件集合称为路径条件。
2. 测试用例生成
符号执行可生成测试用例,其主要目标是分析程序的控制结构并发现其中的错误。通过找到描述控制路径的方程的解,可提取用作测试用例的值,这些值会迫使应用程序遵循定义该路径条件的控制路径。
符号执行主要用于白盒测试,但也可从抽象规范(如状态机)开始应用相同技术。符号化搜索状态空间有助于应对状态空间爆炸问题,因为它通过关联输入类来减少可能的路径数量。
超级会员免费看
订阅专栏 解锁全文
988

被折叠的 条评论
为什么被折叠?



