[论文解读] Enhancing Symbolic Execution of Heap-based Programs with Separation Logic for Test Input Generation
本文提出了一种基于分离逻辑的符号执行框架,用于堆内存程序,以生成完全初始化且有效的测试输入。通过将上下文敏感的延迟初始化与分离逻辑前置条件相结合,该方法消除了无效输入并减少了路径爆炸问题,在评估中实现了98.98%的平均分支覆盖率。
Symbolic execution is a well established method for test input generation. Despite of having achieved tremendous success over numerical domains, existing symbolic execution techniques for heap-based programs are limited due to the lack of a succinct and precise description for symbolic values over unbounded heaps. In this work, we present a new symbolic execution method for heap-based programs based on separation logic. The essence of our proposal is context-sensitive lazy initialization, a novel approach for efficient test input generation. Our approach differs from existing approaches in two ways. Firstly, our approach is based on separation logic, which allows us to precisely capture preconditions of heap-based programs so that we avoid generating invalid test inputs. Secondly, we generate only fully initialized test inputs, which are more useful in practice compared to those partially initialized test inputs generated by the state-of-the-art tools. We have implemented our approach as a tool, called Java StarFinder, and evaluated it on a set of programs with complex heap inputs. The results show that our approach significantly reduces the number of invalid test inputs and improves the test coverage.
研究动机与目标
- 为解决现有符号执行工具在生成堆内存程序有效测试输入方面的局限性。
- 减少因在延迟初始化中显式枚举堆对象选择而导致的路径爆炸问题。
- 通过利用分离逻辑实现精确的堆规格说明,消除部分初始化或无效的测试输入。
- 提升对复杂数据结构生成有意义测试输入的测试覆盖率与效率。
- 为具有可变堆结构的真实世界Java程序提供一种实用且可扩展的符号执行框架。
提出的方法
- 该方法使用一种结合了分离逻辑、存在量词变量、归纳谓词和算术的逻辑,精确描述堆前置条件。
- 引入上下文敏感的延迟初始化,使得符号执行仅探索满足分离逻辑前置条件的状态。
- 采用最小不动点分析计算有效的堆配置,而无需枚举无效配置。
- 该方法仅生成完全初始化的测试输入,避免了后续具体化(post-concretization)的需要。
- 该框架实现为Java StarFinder,基于Symbolic PathFinder构建,用于分析Java字节码。
- 使用分离逻辑公式指导符号执行,并在源代码层面修剪无效路径。
实验结果
研究问题
- RQ1如何利用分离逻辑精确指定堆输入结构,以减少无效测试输入的生成?
- RQ2基于分离逻辑前置条件的上下文敏感延迟初始化能否消除路径爆炸和无效输入?
- RQ3与传统符号执行相比,使用分离逻辑在提升测试覆盖率方面能实现多大程度的改进?
- RQ4该方法在生成复杂可变堆内存数据结构的完全初始化测试输入方面效果如何?
- RQ5将分离逻辑与符号执行结合,是否能够扩展到具有无界堆结构的真实程序?
主要发现
- 与最先进工具相比,所提出的方法显著减少了无效测试输入的数量。
- Java StarFinder在一组复杂的堆内存Java程序上实现了98.98%的平均分支覆盖率。
- 所有生成的测试输入均为完全初始化,无需进行后续具体化。
- 使用分离逻辑前置条件实现了对堆片段的精确、局部推理,避免了全局推理的复杂性。
- 该方法通过避免显式枚举所有可能的堆对象绑定,优于现有方法。
- 分离逻辑与符号执行的集成在真实程序中展现出可扩展性和实用性。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。