Fact-checked by Grok 2 weeks ago

Concolic testing

Concolic testing is a technique that combines concrete execution of a with specific input values and of the same to track path constraints, enabling the automated generation of new test inputs that explore alternative execution paths and achieve high structural . The approach, also known as dynamic symbolic execution, uses the concrete execution to guide the symbolic analysis, mitigating the path explosion problem inherent in pure by focusing on feasible paths encountered during runtime. The technique originated in 2005 with the development of DART (Directed Automated Random Testing), a tool for C programs that integrated random input generation with symbolic constraint solving to systematically explore program paths and detect bugs such as assertion violations and memory errors. Concurrently, the CUTE tool introduced the term "concolic" as a blend of "concrete" and "symbolic," extending the method to handle complex data structures like pointers and dynamic memory allocation in unit testing for C code. Subsequent advancements, such as the KLEE tool built on the LLVM compiler framework, further improved efficiency through bit-precise memory modeling and optimized constraint solving, achieving over 90% code coverage in benchmarks like the GNU Coreutils. In concolic testing, a program executes concretely with an initial input while simultaneously maintaining a state for variables, collecting constraints at points (e.g., if-statements) as symbolic formulas. To explore an untraversed , the negation of the branch condition is added to the path constraint, and a solver like or Z3 generates a new concrete input satisfying the modified constraints, which is then used for the next execution. This process repeats, often guided by heuristics or coverage metrics, until desired coverage is reached or resources are exhausted. Key benefits include the ability to generate compact, high-coverage test suites with inputs that reproduce , making it effective for finding deep defects in real-world software such as network protocols, file systems, and device drivers. Tools like from have applied concolic testing to analysis, discovering hundreds of vulnerabilities in Windows applications. However, limitations persist, including issues with complex constraints (e.g., non-linear arithmetic or floating-point operations) and potential false negatives from unmodeled external calls or concretization divergences. Concolic testing has influenced industrial practices, powering automated in research and being adopted in tools for languages beyond , such as (jCUTE) and even deep neural networks. Its integration with whole-system emulation (e.g., S2E) extends applicability to operating systems and virtual machines, demonstrating ongoing evolution in software .

Introduction and Fundamentals

Definition and Core Principles

Concolic testing is a hybrid technique that integrates execution—running the program with specific, actual input values—and —treating program variables as expressions to model possible execution paths. This combination enables the automated generation of test inputs that systematically explore feasible paths in the code, addressing limitations of purely or approaches alone. The term "concolic" derives from "" and "," highlighting the dual execution modes that operate in tandem to enhance testing efficiency. At its core, concolic testing begins with a concrete execution of the program using an initial input, during which branch conditions encountered along the path are recorded as symbolic constraints. These constraints form a path condition, a logical representing the conditions under which the input leads to that specific execution path. To explore alternative paths, the testing engine negates one of these constraints—typically the last branch condition—to "flip" the decision and generate new inputs that satisfy the modified path condition; this process is solved using a (SMT) solver to produce concrete values for the variables. By iteratively applying this method, concolic testing achieves improved and facilitates the detection of bugs in complex software, such as those involving deep nesting or data dependencies, where might fail. Key concepts in concolic testing distinguish between and states maintained during execution. The state tracks actual values and program behavior to ensure realistic simulation and avoid issues like in symbolic-only analysis, while the state represents inputs and variables as expressions (e.g., linear combinations or non-linear functions) to capture path dependencies abstractly. constraints are formulated as a of s along the execution path, expressed mathematically as the path condition PC = \bigwedge_{i=1}^{k} c_i, where c_i denotes the i-th and k is the number of branches taken. This formulation allows the SMT solver to determine and instantiate new inputs, enabling targeted path exploration without exhaustive enumeration. Concolic testing differs from pure primarily in its hybrid approach, which integrates execution alongside reasoning to mitigate the path problem inherent in exploring all feasible paths. In , the exponential growth of paths due to branching conditions often renders exhaustive analysis computationally infeasible. Concolic testing addresses this by using a input to guide the initial execution , generating path constraints symbolically only for that , and then negating constraints to explore alternatives systematically, thus limiting the search through depth-first or heuristic strategies. Additionally, concolic testing handles non-linear constraints more effectively by substituting values into expressions, simplifying otherwise unsolvable formulas that stall pure . Compared to or , which rely on generating random or mutated inputs to exercise code, concolic testing is more systematic and coverage-directed, systematically inverting path constraints to reach specific that random inputs may overlook, particularly deep or conditional paths. often suffers from , where many inputs produce similar behaviors, leading to low probability of detecting in complex programs. In benchmarks, concolic-fuzzing approaches achieve higher coverage than standalone fuzzers like ; for instance, systems like QSYM demonstrate improved coverage on real-world binaries such as libpng, demonstrating superior for targeted exploration. Unlike , which verifies formal models of system behavior against specifications to prove properties like or liveness, concolic testing emphasizes automated input generation directly from to maximize coverage and uncover bugs, without requiring abstract models or exhaustive state-space enumeration. While both involve path exploration, concolic testing uses explicit path model-checking in a lightweight manner focused on feasible execution traces, avoiding the state explosion of full on concurrent or infinite-state systems. The hybrid nature of concolic testing balances the scalability of executions, which run efficiently on real , with the expressiveness of reasoning for precise solving, enabling higher coverage rates than alone—for example, up to 100% coverage on certain libraries like SGLIB in practical evaluations. This combination yields practical advantages in , particularly for and vulnerability detection, where pure techniques falter on complexity.

History and Development

Origins in Software Verification

Concolic testing emerged from broader research in during the late 1990s and early , drawing inspiration from dynamic techniques aimed at automating test generation for programs with complex control flows and data structures. Researchers sought to overcome the limitations of pure static analysis, which often struggled with real-world software due to challenges like pointer , dynamic allocation, and path in large codebases. These efforts built on foundational methods from the 1970s but shifted toward hybrid approaches that incorporated runtime behavior to improve coverage and practicality. A pivotal precursor was the Directed Automated Random Testing (DART) system, developed by Godefroid, Klarlund, and Sen in 2005, which combined random inputs with solving to direct testing toward unexplored program paths. DART demonstrated the power of this integration by automatically generating test cases without manual intervention, revealing deep bugs in off-the-shelf software like libraries and protocols. This work highlighted the inefficiencies of standalone and laid the groundwork for more systematic exploration in . The term "concolic testing," blending "concrete" and "symbolic" execution, was formally introduced by Sen, Marinov, and Agha in their 2005 ESEC/FSE paper on CUTE, a concolic engine for programs. Motivated by static analysis's inability to handle intricate features like heap-allocated structures in real-world code, CUTE applied concolic execution to generate inputs for unit tests involving memory graphs, achieving higher branch coverage than traditional methods. Early applications focused on , where concolic techniques efficiently explored feasible paths up to a bounded length, addressing verification gaps in systems software. Academic contributions soon expanded concolic testing to JVM through jCUTE, presented by , Viswanathan, and Agha in 2006, which enabled explicit path model-checking for concurrent programs. This extension targeted the limitations of static in object-oriented settings, generating test inputs and schedules to exercise multithreaded behaviors systematically. By 2008, further refinements in scalable dynamic test generation built on these foundations, emphasizing heuristics to mitigate path explosion in larger applications.

Influence of SMT Solvers and Early Implementations

The development of (SMT) solvers in the early 2000s was instrumental in making concolic testing viable for practical . Early tools like Yices, introduced in 2006 by , provided efficient handling of first-order theories including linear arithmetic and uninterpreted functions, which are essential for encoding program constraints. This was followed by STP in 2007, a decision procedure optimized for bit-vectors and arrays, allowing solvers to manage the low-level data structures common in . Z3, released by in 2008, further advanced the landscape with high-performance integration of multiple theories and tactics for constraint simplification, enabling scalable analysis of complex formulas. These innovations shifted SMT solving from computationally prohibitive tasks to efficient processes capable of processing thousands of constraints per second on standard hardware. The impact of these SMT solvers on concolic testing was profound, as they addressed the core challenge of systematically exploring program paths by solving path constraints that incorporate symbolic variables alongside concrete executions. Unlike pure concrete testing, which relies on random or manual inputs and often misses deep code paths, SMT solvers enabled the negation and resolution of branch conditions involving intricate operations such as integer arithmetic, bit manipulations, and pointer dereferences. For instance, solvers like and Yices could efficiently model memory accesses as array theories and arithmetic overflows as bit-vector constraints, allowing concolic approaches to generate inputs that flip decisions at conditional branches without exhaustive enumeration. This capability transformed concolic testing into a directed search method, achieving higher in programs where traditional techniques stalled due to path explosion. Early implementations of concolic testing leveraged these solver advancements to create prototype tools that demonstrated real-world feasibility. , developed around 2008 at the , was among the first open-source concolic testing frameworks for C programs, instrumenting code via CIL to collect path constraints and using Yices as its backend solver. applied randomized search heuristics to prioritize unexplored paths, showcasing effectiveness on open-source benchmarks like those from the libexif library and utilities, where it achieved branch coverage exceeding 80% in under an hour of execution on commodity machines. The integration of Yices in such prototypes markedly improved solver efficiency, reducing path constraint resolution times from hours—typical with earlier ad-hoc solvers—to seconds for common program paths involving up to hundreds of constraints. These initial efforts validated concolic testing's potential for automated bug detection and test generation in legacy codebases.

Methodology

Core Algorithm

Concolic testing operates through an iterative process that combines concrete execution with to systematically explore paths. The algorithm begins with the selection of an initial random concrete input, which is used to perform a concrete execution of the while simultaneously tracking the execution symbolically to build a path condition (PC). This path condition is a of constraints derived from the decisions encountered during execution. To explore alternative paths, the algorithm negates one of the constraints in the PC—typically the last one corresponding to the final —to generate a new path condition ¬PC, and invokes a constraint solver to find a concrete input satisfying this modified condition. This new input is then used for the next iteration, flipping the outcome and potentially revealing new paths. The process repeats until a predefined coverage criterion is met, such as coverage, path coverage, or loop coverage. The core algorithm can be outlined in pseudocode as follows, reflecting the directed search mechanism introduced in early implementations:
function concolic_test(program P, initial_input):
    input = initial_input  // Concrete random input
    covered_paths = set()
    while not coverage_goal_met(covered_paths):
        // Step 1: Concrete execution to collect path trace
        concrete_state, path_trace = run_concrete(P, input)
        
        // Step 2: Parallel symbolic execution to build path condition
        pc = build_path_condition(path_trace)  // Symbolic constraints from branches
        
        // Step 3: Generate new input by solving negated path condition
        negated_pc = negate_last_constraint(pc)  // Flip one branch, e.g., last one
        new_input = solve_constraints(negated_pc)  // Using a constraint solver like lp_solve
        
        if new_input is satisfiable:
            input = new_input
            covered_paths.add(path_trace)
        else:
            // Backtrack or select different constraint to negate
            break  // Or handle infeasibility
    return covered_paths
This captures the essence of the loop-driven exploration, where run_concrete executes the program with numerical values to avoid symbolic explosion issues, and build_path_condition constructs an expression tree representing the symbolic dependencies. The solve_constraints step relies on an off-the-shelf constraint solver to produce concrete values satisfying the negated condition. During execution, the algorithm maintains dual states for variables: a state with numerical values for efficient computation and a state represented as expression trees or linear arithmetic formulas to capture dependencies on inputs. For instance, primitive variables are tracked arithmetically, while pointers may be simplified to or addresses to manage . Branch conditions are evaluated concretely to determine the taken path but recorded symbolically to form the PC, ensuring that the solver can later generate inputs that alter outcomes. Constraint solver invocation occurs at each iteration's end, transforming the symbolic PC into a solvable formula, often in or format. This dual-state approach enables scalability over pure by grounding computations in values. Termination is governed by coverage criteria, with branch coverage being the most common, aiming to exercise all conditional branches in the . Path coverage targets unique execution sequences, while loop coverage ensures iterations up to a bounded depth are explored. These criteria guide the loop until no new paths are discovered or a maximum depth is reached, providing a measure of thoroughness without exhaustive of potentially paths.

Practical Example

To illustrate the concolic testing process, consider a simple C program consisting of a helper function and a target function that contains an error path, as used in explanations of concolic testing. The program is defined as follows:
c
int double(int v) {
    return 2 * v;
}

void testme(int x, int y) {
    int z = double(y);
    if (z == x) {
        if (x > y + 10) {
            ERROR;  // An error condition, e.g., a potential buffer overflow or invalid state
        }
    }
}
This program has two branches: one checking if z == x (i.e., 2*y == x), and a nested branch checking if x > y + 10. The goal is to explore all feasible paths, including the error path, to achieve full branch coverage. The concolic testing process begins with an initial concrete execution using randomly chosen inputs, such as x = 22 and y = 7. During this run, z is computed concretely as 2 * 7 = 14. The first branch condition z == x (i.e., 14 == 22) evaluates to false, so the execution skips the inner if-statement. The symbolic path condition (PC) accumulated is 2*y ≠ x. To explore the untaken branch, this condition is negated to 2*y == x, and a constraint solver (e.g., an solver like ) is used to find new inputs satisfying the negated PC while preserving prior constraints (here, none). One solution is x = 2, y = 1. A second concrete execution uses these new inputs: x = 2, y = 1, yielding z = 2. Now, z == x ( 2 == 2 ) is true, taking the first , but the inner x > y + 10 ( 2 > 11 ) is false, skipping the . The updated PC is 2*y == x ∧ x ≤ y + 10. Negating the last branch condition gives 2*y == x ∧ x > y + 10, solved to x = 30, y = 15. The third execution with these inputs: z = 30, z == x true, and 30 > 25 true, reaches the ERROR path, achieving 100% branch coverage. The following table summarizes the execution traces, paths explored, accumulated constraints, and generated inputs:
Run Inputs (x, y)Path TakenAccumulated PCNegated PC for Next InputsNew Inputs Generated
1(22, 7)Skip first if2*y ≠ x2*y == x(2, 1)
2(2, 1)Take first if, skip second if2*y == x ∧ x ≤ y + 102*y == x ∧ x > y + 10(30, 15)
3(30, 15)Take both ifs2*y == x ∧ x > y + 10(coverage complete)N/A
This process demonstrates how concolic testing systematically generates inputs to flip branches, ensuring comprehensive path exploration. In this example, concolic testing detects the error path that might miss, highlighting its utility for uncovering issues like off-by-one errors in boundary conditions (e.g., near y + 10) where inputs like x = y + 11 could trigger overflows or invalid states in more complex code.

Applications and Tools

Open-Source and Commercial Tools

Several prominent open-source tools implement concolic testing, primarily targeting and programs through and engines. KLEE is a dynamic tool built on the compiler infrastructure, supporting concolic testing for and code by generating high-coverage test inputs via path exploration and constraint solving. It originally used the solver but has been extended to support backends like Z3 and supports runtime for system-level testing. In evaluations on Unix utilities, KLEE achieved 84.5% overall line coverage and uncovered ten unique bugs in the GNU Coreutils package, including memory errors and assertion violations, with generated tests integrated into the project's test suite. CREST is another open-source concolic testing tool for C programs, employing source-level instrumentation via the CIL framework to track symbolic constraints during execution and generate inputs using SMT solvers such as Yices or Z3. It focuses on scalable path exploration with heuristics to prioritize under-tested branches, enabling efficient test generation for larger codebases like the grep utility, where it demonstrated improved coverage over random testing. On the commercial side, Microsoft's represents a widely adopted concolic execution tool for binary-level analysis of x86 applications, integrating concrete execution tracing with Z3-based symbolic solving to automate fuzz testing at . Deployed internally across hundreds of Windows applications, SAGE has discovered thousands of bugs, emphasizing its role in verification for languages like C/C++ without requiring . Extensions of concolic testing appear in specialized open-source tools for mobile environments, such as ACTEve, which adapts the technique for apps by symbolically modeling GUI events and system calls to generate input sequences, supporting via . These tools collectively highlight concolic testing's versatility across binaries, , and app frameworks, often leveraging solvers like Z3 or CVC5 for constraint resolution.

Adoption and Case Studies

One prominent example of concolic testing's commercial adoption is Microsoft's (Automated Whitebox Fuzz Testing) tool, which was deployed extensively from onward to identify vulnerabilities in Windows components and other applications. In its early development phase, SAGE discovered over 30 previously unknown bugs in shipped Windows software, including critical issues in image processors, media parsers, and document handlers, such as stack overflows and dereferences. By 2012, after accumulating over 400 machine-years of execution, SAGE had identified roughly one-third of all bugs found through file during Windows 7 development, demonstrating its scalability and effectiveness in large-scale . In research and competitive settings, concolic testing has powered automated vulnerability discovery, as seen in DARPA's 2016 Cyber Grand Challenge (CGC), where teams developed systems for real-time flaw detection and patching without human intervention. Tools like Driller, which augments with selective concolic execution to explore hard-to-reach paths, were integral to participants' approaches, enabling the identification of software vulnerabilities in a capture-the-flag format. Similarly, the winning system from ForAllSecure relied on binary concolic execution to autonomously detect and exploit flaws in provided binaries, highlighting concolic methods' role in advancing cyber reasoning systems. A key industrial case study involves Mobis's application of concolic testing to automotive software, specifically the Integrated Body Unit (IBU) ECU, which manages body control, smart key, and tire pressure monitoring functions under standards. Using the MAIST framework, engineers achieved 90.5% branch coverage and 77.8% (MC/DC) through automated generation, addressing challenges like symbolic bit-fields and function pointers. This effort reduced from 30 to 14 man-months, a 53.3% decrease, while ensuring compliance with standards. Studies evaluating concolic testing's effectiveness consistently show it attains higher structural coverage than due to targeted path exploration via constraint solving. In the automotive domain, the 90.5% coverage from the Mobis exemplifies this advantage over traditional random or manual methods, which often plateau below 60% in complex embedded systems. Recent integrations in the have incorporated concolic tools into pipelines for continuous verification, enhancing automated in agile development cycles. Emerging applications of concolic testing include cloud environments, where parallelized concolic execution leverages elastic resources for scalable test generation, improving reliability in distributed systems like virtualized services. In firmware analysis, tools such as enable concolic co-execution on real microcontrollers via serial interfaces, bypassing limitations to discover vulnerabilities; for example, a fuzzer using identified 7 new bugs in three firmware samples, outperforming prior methods by orders of magnitude in speed and completeness. As of 2025, concolic testing has been extended to quantum programs, with frameworks like QCT achieving high path coverage in quantum circuits, and integrated with large language models to guide test generation for complex software systems.

Limitations and Challenges

Technical Constraints

One of the primary technical constraints in concolic testing arises from the computational expense of constraint solving, exacerbated by path explosion. In concolic testing, each execution path generates a set of symbolic constraints that must be solved to produce inputs for alternative branches, but the number of feasible paths grows exponentially in programs with loops, conditional nesting, or recursive structures. This path explosion leads to an overwhelming search space, where solver invocations become prohibitively time-consuming, often resulting in incomplete exploration within practical time limits. For instance, in operating system kernels, the sheer volume of paths from symbolic arrays and loops can generate millions of states, causing execution to stall or terminate prematurely. Symbolic representation poses another significant challenge, as concolic testing struggles with certain data types and program features. Constraint solvers typically lack robust support for or non-linear , leading to infeasible or stalled solving processes when these elements are encountered in the path conditions. External calls, such as system APIs or library functions, further complicate representation, as their behaviors are often modeled imprecisely or concretized, limiting deep exploration. In multithreaded code, concolic testing inadequately captures concurrency issues like race conditions, since it primarily executes single-threaded paths and overlooks interleaved executions. Scalability remains a core limitation, particularly for large codebases, due to high memory demands and incomplete coverage. Symbolic expression trees, which grow with path complexity, can consume substantial resources—up to gigabytes of for moderately sized programs—leading to out-of-memory errors or forced concretization. In practice, this results in low coverage for expansive systems like kernels; for example, concolic testing on GPU kernels achieves branch coverage below 50% in cases involving intricate data structures. Studies from the indicate that solver timeouts affect 30-50% of paths in real-world programs, underscoring the technique's challenges in achieving comprehensive testing.

Emerging Solutions and Future Directions

Recent advancements in concolic testing have introduced hybrid extensions that leverage to enhance path exploration and address scalability issues in traditional approaches. Agentic concolic execution, developed in the mid-2020s, integrates (LLM) agents to guide path selection by analyzing execution traces and prioritizing semantically relevant branches, achieving up to 233% higher compared to tools like KLEE on benchmarks such as FP-Bench. This method uses LLMs for constraint summarization and solver integration, enabling language-agnostic testing and identifying vulnerabilities in real-world software that conventional or random selection miss. Hybrid concolic testing with further widens exploration by combining greybox 's rapid state generation with concolic execution's precise input synthesis, often augmented by LLMs to bypass modeling overheads. For instance, HyLLfuzz employs LLM-based concolic execution to slice traces and mutate inputs, yielding 40-50% more coverage than prior fuzzers like QSYM and reducing concolic time by 4-19 times on standard benchmarks. These extensions mitigate path explosion by focusing on high-impact mutations, improving efficiency by 2-5 times in coverage-guided scenarios without exhaustive . Cloud-based concolic testing, originating around 2012, has expanded in the 2020s to support constraint solving across distributed environments, enabling simultaneous execution of multiple test paths on virtual machines. Implementations like tools such as demonstrate performance gains through parallelization, testing programs in isolated instances to enhance scalability and security for . Recent parallel engines, such as KLEEWT, extend this by multi-threading with multiple solvers, achieving up to 12.5% faster execution and 21% reduced solver time on Coreutils programs. Support for multithreading has advanced through extensions to frameworks like PathFinder (JPF), which now facilitate scalable concolic testing of parallel programs on heterogeneous platforms. The CT-DDS project generalizes concolic execution for massively parallel computing, reducing state explosion in concurrent scenarios via targeted path reduction techniques. JPF's Symbolic PathFinder extension integrates concolic principles for multithreaded verification, enabling efficient exploration of thread interleavings in safety-critical systems. Looking ahead, integration of for approximation promises to lighten the symbolic burden in concolic testing, particularly for complex domains like . Tools like use inductive synthesis to approximate path conditions from concrete executions, boosting branch coverage by 67% over fuzzers and detecting 61 bugs in frameworks such as . In AI safety, concolic methods like DeepConcolic apply to neural networks by generating adversarial inputs via quantified constraints, achieving over 97% neuron coverage on datasets like MNIST to uncover robustness failures. Applications in quantum software verification represent another frontier, with quantum concolic testing adapting symbolic objects to handle probabilistic states and measurements. This , built on , generates constraints for quantum branches using solvers like dReal, attaining 74%+ branch coverage on programs with up to five qubits and exposing errors in state checks. These directions suggest concolic testing will evolve toward AI-assisted, parallelized, and domain-specific variants, enhancing reliability in emerging computational paradigms.

References

  1. [1]
    Symbolic Execution For Software Testing: Three Decades Later
    Feb 1, 2013 · DART is the first concolic testing tool that combines dynamic test generation with random testing and model checking techniques with the goal of ...
  2. [2]
    CUTE: a concolic unit testing engine for C - ACM Digital Library
    The paper addresses the problem of automating unit testing with memory graphs as inputs. The approach used builds on previous work combining symbolic and ...
  3. [3]
    A Survey of Symbolic Execution Techniques - ACM Digital Library
    ... A Survey of Symbolic Execution Techniques. Download; 149.31 KB. References. [1] ... https://dl.acm.org/doi/10.1145/3769013. Miftah SSrivastava AKim HWei S ...
  4. [4]
    [PDF] CUTE: A Concolic Unit Testing Engine for C
    Sep 5, 2005 · This paper presents two case studies of testing code using. CUTE. The first study involves the C code of the CUTE tool itself. The second ...Missing: original | Show results with:original
  5. [5]
    Concolic testing for functional languages - ScienceDirect
    Nov 1, 2017 · Concolic testing is a software testing technique that simultaneously combines concrete execution of a program (given specific input, along specific paths) with ...Missing: seminal | Show results with:seminal
  6. [6]
    [PDF] Symbolic Execution for Software Testing: Three Decades Later
    Apr 10, 2013 · Concolic testing handles this situation by replacing some of the symbolic val- ues with their concrete values so that the resultant constraints ...
  7. [7]
    [PDF] A Practical Concolic Execution Engine Tailored for Hybrid Fuzzing
    Aug 17, 2018 · Test cases generated by QSYM cover significantly more lines than both concolic executors. In libtiff, Driller could not generate any test case ...
  8. [8]
    [PDF] CUTE and jCUTE : Concolic Unit Testing and Explicit Path Model ...
    Concolic testing involves explicit path model-checking in which our goal is to generate data inputs and schedules that would exercise all feasi- ble execution ...
  9. [9]
    [PDF] CUTE: A Concolic Unit Testing Engine for C - People @EECS
    This paper presents two case studies of testing code using. CUTE. The first study involves the C code of the CUTE tool itself. The second case study found two ...
  10. [10]
    DART: directed automated random testing - ACM Digital Library
    We present a new tool, named DART, for automatically testing software that combines three main techniques.
  11. [11]
    CUTE and jCUTE: concolic unit testing and explicit path model ...
    CUTE, a Concolic Unit Testing Engine for C and Java, is a tool to systematically and automatically test sequential C programs (including pointers) and ...
  12. [12]
    Heuristics for Scalable Dynamic Test Generation - UC Berkeley EECS
    On these benchmarks, the presented heuristics achieve significantly greater branch coverage on the same testing budget than concolic testing with a traditional ...
  13. [13]
    [PDF] The YICES SMT Solver
    Yices is an efficient SMT solver that decides the satisfiability of complex formulas in theories like arithmetic and uninterpreted functions. It generalizes ...
  14. [14]
    A Decision Procedure for Bit-Vectors and Arrays | SpringerLink
    STP is a decision procedure for the satisfiability of quantifier-free formulas in the theory of bit-vectors and arrays that has been optimized for large ...
  15. [15]
    Z3: An Efficient SMT Solver - SpringerLink
    Z3 is a new and efficient SMT Solver freely available from Microsoft Research. It is used in various software verification and analysis applications.
  16. [16]
    [PDF] Heuristics for Scalable Dynamic Test Generation - People @EECS
    Recently, concolic testing [7], [8] and a related technique [9] have been proposed which run symbolic execution simultaneously with concrete executions. These ...
  17. [17]
    [PDF] DART: Directed Automated Random Testing - People @EECS
    We present a new tool, named DART, for automatically testing soft- ware that combines three main techniques: (1) automated extrac- tion of the interface of a ...
  18. [18]
    [PDF] KLEE: Unassisted and Automatic Generation of High-Coverage ...
    5.2.3 Bugs found. KLEE found ten unique bugs in COREUTILS (usually memory ... KLEE testing for 15 randomly-chosen COREUTILS utilities. Manual testing.
  19. [19]
    jburnim/crest: CREST is a concolic test generation tool for C. - GitHub
    You can find a list of papers using CREST at https://burn.im/crest/#publications . NOTE: CREST is no longer being actively developed, but questions are still ...
  20. [20]
    [PDF] Automated Whitebox Fuzz Testing
    Whitebox fuzz testing starts with a fixed input, symbolically executes the program, gathers input constraints, and uses a constraint solver to generate new ...
  21. [21]
    [PDF] Billions and Billions of Constraints: Whitebox Fuzz Testing in ...
    We report experiences with constraint-based whitebox fuzz testing in production across hundreds of large Win- dows applications, multiple Microsoft product ...
  22. [22]
    [PDF] Automated Concolic Testing of Smartphone Apps
    This paper presents an algorithm and system, ACTEve, for generating input events to exercise smartphone apps using concolic testing, addressing the branch- ...
  23. [23]
    [PDF] Driller: Augmenting Fuzzing Through Selective Symbolic Execution
    Feb 24, 2016 · Driller uses selective concolic execution to explore only the paths deemed interesting by the fuzzer and to generate inputs for conditions that ...
  24. [24]
    Automating Vulnerability Discovery in Critical Applications - SEI Blog
    ForAllSecure is one of the world's leading experts on binary concolic execution and is widely known for its Mayhem concolic executor, which recently won DARPA's ...
  25. [25]
    [PDF] Concolic Testing for High Test Coverage and Reduced Human Effort ...
    We have presented the industrial study of applying concolic testing to the automotive software developed by Mobis. Af- ter we identified and addressed the ...
  26. [26]
    [PDF] Experimental Comparison of Concolic and Random Testing for Java ...
    Abstract. Concolic testing is a method for test input generation where a given program is executed both concretely and symbolically at the same time.
  27. [27]
    An empirical investigation into branch coverage for C programs ...
    Many authors have demonstrated that both concolic based and search based techniques can outperform purely random test data generation.
  28. [28]
    Cloud-based parallel concolic execution - IEEE Xplore
    In this paper, we propose a novel approach, named PACCI, which parallelizes concolic execution and adapts to the drastic changes of computing resources by ...
  29. [29]
    [PDF] Concolic Test Generation and the Cloud - Nikolai Kosmatov
    We underline several successful applications of concolic testing il- lustrating how this testing technique can improve the reliability of cloud environments.
  30. [30]
    [PDF] CO3: Concolic Co-execution for Firmware - USENIX
    Aug 16, 2024 · On the front of vulnerability detection, concolic execution— a prominent software testing technique—has seen tremendous success and demonstrated ...<|control11|><|separator|>
  31. [31]
    [PDF] Practical Concolic Testing Techniques for COTS Operating Systems
    Jul 14, 2017 · In this paper, we propose CAB-FUZZ (Context-Aware and Boundary-focused), a practical concolic testing tool to quickly explore interesting paths ...Missing: seminal | Show results with:seminal
  32. [32]
    [PDF] Boosting Concolic Testing via Interpolation - Jorge A. Navas
    Since the seminal papers of [9, 15] many works have been published improving concolic testing in different ways. We limit our discussion to related works ...
  33. [33]
    [PDF] Challenges and Opportunities with Concolic Testing - UF ECE
    In this paper, we discuss challenges to widespread adoption of concolic testing in an industrial setting and highlight further opportunities where concolic ...Missing: survey | Show results with:survey
  34. [34]
    [PDF] GKLEE: Concolic Verification and Test Generation for GPUs
    Abstract. Programs written for GPUs often contain correctness errors such as races, deadlocks, or may compute the wrong result. Existing.
  35. [35]
    [PDF] Agentic Concolic Execution - Abhik Roychoudhury
    Abstract—Concolic execution is a practical test generation technique that explores execution paths by coupling concrete execution with symbolic reasoning.
  36. [36]
  37. [37]
    [PDF] KLEEWT: A parallel symbolic execution engine - SFU Summit
    Cloud-based parallel concolic execution[10] presents a new way of speeding up concolic execution, which is a technique that combines concrete and symbolic ...
  38. [38]
    SHF: Small: CT-DDS - Scalable Concolic Testing of Parallel ...
    The goal of this research is to generalize concolic testing to test parallel programs on heterogeneous massively parallel computing platforms.
  39. [39]
    [PDF] Symbolic PathFinder: Symbolic Execution of Java Bytecode
    Sep 24, 2010 · Symbolic Pathfinder (SPF) combines symbolic execution with model checking and constraint solving for automated test.
  40. [40]
    [PDF] Lightweight Concolic Testing via Path-Condition Synthesis for Deep ...
    At the end of the symbolic execution, solving the PC using a constraint solver generates a test input that executes the same path as the symbolic execution. 1 ...
  41. [41]
    [PDF] Concolic Testing for Deep Neural Networks - Daniel Kroening
    In this paper, we propose the first concolic testing method for DNNs. We implement it in a software tool and apply the tool to evaluate the robustness of ...Missing: survey | Show results with:survey<|control11|><|separator|>
  42. [42]