Search papers, labs, and topics across Lattice.
This paper formalizes the semantics of symbolic execution in Java, specifically focusing on the path-merging optimization used in the Java Ranger tool. By providing a rigorous framework that proves the soundness of the transformations applied during symbolic execution, the authors address the critical gap in ensuring the correctness of these tools, which is essential for maintaining software reliability. The key result is the establishment that Java Ranger's path-merging process effectively preserves the semantics of the original Java programs, thereby enhancing the reliability of symbolic execution in safety-critical applications.
Formalizing the soundness of symbolic execution tools reveals that path-merging can significantly enhance software reliability without sacrificing correctness.
Symbolic execution plays a critical role in software reliability, as they are used to find bugs, generate test cases, and provide correctness guarantees, particularly for safety-critical systems. Yet their own correctness is rarely subject to formal scrutiny, as it is typically established empirically by evaluating tool behavior across many programs. This leaves open the possibility that the tools themselves introduce unsoundness, potentially invalidating the verification results they produce and undermining the very guarantees they are meant to provide. In this paper, we address this gap by providing the formal treatment of symbolic execution with path-merging, an optimization that improves path explosion by summarizing branching code regions into disjunctive constraints rather than exploring each path independently. Specifically, we target Java Ranger, a path-merging tool for Java programs that progressively transforms imperative Java code toward the language of formal logic through a series of code transformations. We formalize each of these transformations and prove their soundness with respect to a simplified version of the Java concrete semantics, establishing that Java Ranger's path-merging process preserves program semantics.