Academia.eduAcademia.edu

Symbolic Execution

description979 papers
group685 followers
lightbulbAbout this topic
Symbolic execution is a program analysis technique that evaluates a program's behavior by using symbolic values instead of concrete inputs. It systematically explores program paths to determine potential outcomes, enabling the detection of errors, vulnerabilities, and verification of properties without executing the program with specific inputs.
lightbulbAbout this topic
Symbolic execution is a program analysis technique that evaluates a program's behavior by using symbolic values instead of concrete inputs. It systematically explores program paths to determine potential outcomes, enabling the detection of errors, vulnerabilities, and verification of properties without executing the program with specific inputs.

Key research themes

1. How can symbolic execution effectively generate test inputs for programs with complex or structured data, including heap and database inputs?

This research area focuses on extending symbolic execution techniques to automatically generate test data for software programs that handle complex input domains beyond primitives—such as dynamically allocated data structures on the heap or relational databases—and on overcoming associated challenges like capturing structural invariants and handling SQL constraints. This matters as many real-world applications process complex data shapes requiring sophisticated input generation for thorough testing and bug detection.

Key finding: Introduces an approach translating database manipulation code embedded with SQL into relational constraints over symbolic relational symbols, enabling precise test data generation for database programs by capturing database... Read more
Key finding: Proposes the HEX language for specifying invariants of partially initialized heap data structures and provides a decision procedure integrated with symbolic execution that incrementally evaluates these complex structural... Read more
Key finding: Develops a hybrid approach that uses symbolic execution to extract path conditions characterizing input structure dependencies, and subsequently formulates these as optimization problems solved by search-based techniques to... Read more
Key finding: Presents ATGen, a tool combining symbolic execution with constraint logic programming to overcome traditional limitations and automate test data generation. This approach systematically explores symbolic program paths,... Read more
Key finding: Introduces an incremental dynamic symbolic execution method that exploits observability-based coverage criteria (OMC/DC), combining it with structural test generation to selectively generate inputs that not only cover... Read more

2. What strategies improve the scalability and path explosion challenges inherent in symbolic execution?

Symbolic execution often suffers from state-space explosion due to exponential growth of program paths with input size or code complexity, limiting its practical applicability. Research focuses on novel analyses, pruning, caching, and incremental techniques to reduce redundant exploration, improve SMT query efficiency, and prioritize relevant program paths. These improvements aim to make symbolic execution feasible on large scale or complex software.

Key finding: Proposes past-sensitive pointer analysis which performs pointer analysis on-demand at symbolic execution points with a path-specific abstraction of the dynamic state, enhancing precision while incurring modest overhead.... Read more
Key finding: Develops a novel caching technique handling address-dependent SMT queries typical in symbolic execution with symbolic pointers by abstracting concrete address values with symbolic ones. This normalizes and coalesces... Read more
Key finding: Introduces a sound method for detecting and pruning redundant program states unlikely to reach new code prior to execution, thereby mitigating path explosion. Experiments on 66 real-world programs show dramatic speedups... Read more
Key finding: Presents chopped symbolic execution, allowing users to specify program parts to exclude from analysis while lazily executing excluded code only when side effects become relevant. By combining on-demand static analyses, this... Read more
Key finding: Comprehensively surveys techniques addressing scalability bottlenecks in symbolic execution such as path explosion and constraint solving limitations. It identifies key methods like path prioritization heuristics, state... Read more

3. How can symbolic execution be extended or adapted to higher-level or domain-specific program analyses, including higher-order languages, security contracts, and specific application domains?

Beyond imperative program paths, symbolic execution is being adapted to verify properties in higher-order functional languages, enforce software contracts, analyze security properties like noninterference, and specifically target domains such as JavaScript, Android applications, and microcode. This theme encapsulates efforts to broaden symbolic execution’s applicability through novel semantic models, integration with specifications, and domain-tailored symbolic engines.

Key finding: Introduces a novel higher-order symbolic execution framework that models symbolic higher-order values using behavioral contracts, enabling modular and soft contract verification in untyped functional languages. Shows that... Read more
Key finding: Develops Cosette, a trustable compositional symbolic execution framework for JavaScript that addresses the lack of frame property in dynamic languages by introducing an instrumented semantics and proving soundness. The... Read more
Key finding: Presents a dynamic symbolic execution engine for Android apps that avoids manual modeling of Android framework libraries by synthesizing library behaviors on demand through iterative refinement during execution. This... Read more
Key finding: Proposes an automatic analysis of information flow security by self-composition combined with symbolic execution to test noninterference properties. The framework translates security properties into path equivalences checked... Read more
Key finding: Demonstrates the integration of SMT solving techniques in the symbolic execution framework for microcode verification, replacing traditional Boolean SAT backends. Tailored SMT optimizations handle bit-vector theories... Read more

All papers in Symbolic Execution

Message sequence charts (MSCs) are a widely used visual formalism for scenario-based specifications of distributed reactive systems. In its conventional usage, an MSC captures an interaction snippet between concrete objects in the system.... more
We present the Java Bytecode Symbolic Executor (JBSE), a symbolic executor for Java programs that operates on complex heap inputs. JBSE implements both the novel Heap EXploration Logic (HEX), a symbolic execution approach to deal with... more
We present jFuzz, a automatic testing tool for Java programs. jFuzz is a concolic whitebox fuzzer, built on the NASA Java PathFinder, an explicit-state Java model checker, and a framework for developing reliability and analysis tools for... more
Achieving ultra-high reliability in AI-generated code demands a systematic, multi-layered filtration framework that spans syntactic enforcement, semantic analysis, dynamic testing, and formal verification. This paper surveys existing... more
Blockchain and smart contracts have transformed industries by automating complex processes and transactions. However, this innovation has introduced significant security concerns, potentially leading to loss of financial assets and data... more
Análise Probabilística de Software (PSA) visa a quantificar a probabilidade de que um evento de interesse seja alcançado durante a execução de um programa, dada uma caracterização probabilística do comportamento do programa ou do seu... more
We propose an approach to test service evolution in the context of service oriented systems. Such systems are composed of orchestrations which interact with users and coordinate services to fulfill users' requests. The tester only... more
Conditioned slicing can be applied to reverse engineering problems which involve the extraction of executable fragments of code in the context of some criteria of interest. This paper introduces ConSUS, a conditioner for the Wide Spectrum... more
Program conditioning consists of identifying and removing a set of statements which cannot be executed when a condition of interest holds at some point in a program. It has been applied to problems in maintenance, testing, re-use and... more
We describe a testing technique that uses information computed by symbolic execution of a program unit to guide the generation of inputs to the system containing the unit, in such a way that the unit's, and hence the system's, coverage is... more
As mathematical computing becomes more democratized in high-level languages, high-performance symbolic-numeric systems are necessary for domain scientists and engineers to get the best performance out of their machine without deep... more
Slicing is a widely used technique for supporting comprehension and assessing change impact during software evolution activities. While there has been substantial research into the slicing of particular model types, model-based software... more
Integers represent a growing and underestimated source of vulnerabilities in C and C++ programs. In this paper, we present the as-if infinitely ranged (AIR) integer model, which provides a largely automated mechanism for eliminating... more
We propose a novel formal method to compute an upper estimation of the WCET that contains the loss of precision and also can be easily parametrized by the hardware architecture. Assuming that there exists an executable timed model of the... more
Object-oriented hardware design languages like SystemC have become very popular to co-design hardware and software systems. Such designs are classically translated into a transition system in order to verify a specification with... more
Abstract--In this paper we present a model able to serve in validating either functional or non-functional properties of the hard real time systems. We firstly introduce the timed SystemC waiting state automata (TWSA) that will serve in... more
Abstract—A number of structural coverage criteria have been proposed to measure the adequacy of testing efforts. In the avionics and other critical systems domains, test suites satisfying structural coverage criteria are mandated by... more
This thesis is a milestone in four joyful years of work with amazing UMN Critical Systems Group (CriSys). My experience at UMN has been nothing short of spectacular. Since my first day on August 20th, 2014 I have felt at home at UMN with... more
A number of structural coverage criteria have been proposed to measure the adequacy of testing efforts. In the avionics and other critical systems domains, test suites satisfying structural coverage criteria are mandated by standards.... more
Structural coverage metrics have been widely used to measure test suite adequacy as well as to generate test cases. In previous investigations, we have found that the fault-finding effectiveness of tests satisfying structural coverage... more
Software analysis tools and techniques often leverage structural code coverage information to reason about the dynamic behavior of software. Existing techniques instrument the code with the required structural obligations and then monitor... more
As an extension of our previous work on imperative program verification, we present a formalism for handling the total correctness of While loops in imperative programs, consisting in functional based definitions of the verification... more
As mathematical computing becomes more democratized in high-level languages, high-performance symbolic-numeric systems are necessary for domain scientists and engineers to get the best performance out of their machine without deep... more
The article deals with deconstructing one of the most long-living myths of Assyriology—the identification of the head hanging from the tree in the “Garden Scene” of Ashurbanipal as the head of his enemy, the Elamite king Te’umman. I prove... more
Mocking is an essential unit testing technique for isolating the class under test (CUT) from its dependencies. Developers often leverage mocking frameworks to develop stub code that specifies the behaviors of mock objects. However,... more
Using large-scale distributed resources can help find vulnerabilities and malicious code. This project studied the feasibility of distributing two kinds of static analyses of machine code across large-scale donated computational cycles:... more
An Input Output Symbolic Transition System (IOSTS) specifies all expected sequences of input and output messages of a reactive system. Symbolic execution over this IOSTS then allows to generate a set of test cases that can exercise the... more
In this paper we present one of the symbolic factor analysis method called as symbolic kernel discriminant analysis (symbolic KDA) for face recognition in the framework of symbolic data analysis. Classical factor analysis methods... more
Coding against interfaces is a powerful technique in object-oriented programming. It decouples code and enables in-dependent development. However, code decoupled via in-terfaces poses additional challenges for testing and dynamic... more
We propose a novel fine-grained integration of pointer analysis with dynamic analysis, including dynamic symbolic execution. This is achieved via past-sensitive pointer analysis, an on-demand pointer analysis instantiated with an... more
Symbolic execution is a powerful program analysis technique that systematically explores multiple program paths. However, despite important technical advances, symbolic execution often struggles to reach deep parts of the code due to the... more
Symbolic execution (SE) is a popular program analysis technique. SE heavily relies on satisfiability queries during path exploration, often resulting in the majority of the time being spent on solving these queries. Hence, it is not... more
We propose a novel fine-grained integration of pointer analysis with dynamic analysis, including dynamic symbolic execution. This is achieved via past-sensitive pointer analysis, an on-demand pointer analysis instantiated with an... more
Modular verification of shared data structures is a challenging problem: Side-effects in one module that are observable in another module make it hard to analyze each module separately. We present a novel approach for modular verification... more
In the case of coverage biased random testing of programs, random generation is used to first draw a set of paths from the control flow graph of the program. Then, some solver is used for trying to derive input values that leads the... more
Low level code is challenging: It lacks structure, it uses jumps and symbolic addresses, the control flow is often highly optimized, and registers and memory locations may be reused in ways that make typing extremely challenging.... more
In recent years, the use of symbolic analysis in systems for testing and verifying programs has experienced a resurgence. By "symbolic program analysis", we mean logic-based techniques to analyze state changes along individual program... more
This paper presents MCDASH, a refinement-based model checker for machine code. While model checkers such as SLAM, BLAST, and DASH have each made significant contributions in the field of verification/flaw-detection, their use has been... more
The Passel verification tool for parameterized networks of hybrid automata is presented in this paper. Passel automatically proves safety properties of networks of arbitrarily many interacting copies of a template hybrid automaton with... more
As with many software systems whether manually engineered or automatically generated, the need to identify and eliminate or resolve errors in the system's implementation-so-called "bugs" is an important aspect of good and effective... more
Constraint solvers are well-known tools for solving many real-world problems such as theorem proving and real-time scheduling. One of the domains that strongly relies on constraint solvers is the technique of symbolic execution for... more
Smart contracts are Turing-complete programs that are executed across a blockchain. Unlike traditional programs, once deployed, they cannot be modified. As smart contracts carry more value, they become more of an exciting target for... more
Since the original development of program slicing in 1979 [1] there have been many attempts to define a suitable semantics which will precisely define the meaning of a slice. Particular issues include handling termination and... more
The main goal of the seminar "Practical Software Testing: Tool Automation and Human Factors" was to bring together academics working on algorithms, methods, and techniques for practical software testing, with practitioners, interested in... more
Binary rewriting is the process of transforming executables by maintaining the original binary's functionality, while improving it in one or more metrics, such as energy use, memory use, security, or reliability. Although several... more
Symbolic execution is a program analysis technique commonly utilized to determine whether programs violate properties and, in case violations are found, to generate inputs that can trigger them. Used in the context of security properties... more
Download research papers for free!