Daniel Kroening

dblp:k/DanielKroening · also Daniel Kröning · DBLP profile ↗
← Back
200ranked-venue papers
28as first author
22since 2021 · last 2026
0000-0002-6681-5283ORCID · verified

Domains — the database's venue-derived domains; a paper can count in several

Software engineering, systems software and programming languages · 125 · 19 first-author · 6 since 2021Theory of computation · 63 · 14 first-author · 2 since 2021Systems, architecture and hardware · 33 · 5 first-author · 1 since 2021Artificial intelligence and machine learning · 22 · 1 first-author · 13 since 2021Graphics, computer vision, multimedia, augmented reality and games · 7 · 5 since 2021Security and privacy · 5 · 1 since 2021Computer networks · 2
YearPublicationVenuePosition
2026 Symbolic Task Inference in Deep Reinforcement Learning (Abstract Reprint)
abstract
This paper proposes DeepSynth, a method for effective training of deep reinforcement learning agents when the reward is sparse or non-Markovian, but at the same time progress towards the reward requires achieving an unknown sequence of high-level objectives. Our method employs a novel algorithm for synthesis of compact finite state automata to uncover this sequential structure automatically. We synthesise a human-interpretable automaton from trace data collected by exploring the environment. The state space of the environment is then enriched with the synthesised automaton, so that the generation of a control policy by deep reinforcement learning is guided by the discovered structure encoded in the automaton. The proposed approach is able to cope with both high-dimensional, low-level features and unknown sparse or non-Markovian rewards. We have evaluated DeepSynth’s performance in a set of experiments that includes the Atari game Montezuma’s Revenge, known to be challenging. Compared to approaches that rely solely on deep reinforcement learning, we obtain a reduction of two orders of magnitude in the iterations required for policy synthesis, and a significant improvement in scalability.
Hosein Hasanbeig, Natasha Yogananda Jeppu, Alessandro Abate, Tom Melham, Daniel Kroening
AAAI5
2026 The Secrets Must Not Flow: Scaling Security Verification to Large Codebases
abstract
Existing program verifiers can prove advanced properties about security protocol implementations, but are difficult to scale to large codebases because of the manual effort required. We develop a novel methodology called *Diodon* that addresses this challenge by splitting the codebase into the protocol implementation (the *Core*) and the remainder (the *Application*). This split allows us to apply powerful semi-automated verification techniques to the security-critical Core, while fully-automatic static analyses scale the verification to the entire codebase by ensuring that the Application cannot invalidate the security properties proved for the Core. The static analyses achieve that by proving *I/O independence*, i.e., that the I/O operations within the Application are independent of the Core's security-relevant data (such as keys), and that the Application meets the Core's requirements. We have proved Diodon sound by first showing that we can safely allow the Application to perform I/O independent of the security protocol, and second that manual verification and static analyses soundly compose. We evaluate Diodon on two case studies: an implementation of the signed Diffie-Hellman key exchange and a large (100k+ LoC) production Go codebase implementing a key exchange protocol for which we obtained secrecy and injective agreement guarantees by verifying a Core of about 1% of the code with the auto-active program verifier Gobra in less than three person months.
Linard Arquint, Samarth Kishor, Jason R. Koenig, Joey Dodds, Daniel Kroening, Peter Müller 0001
SP5
2026 Causal Explanations for Image Classifiers
abstract
Existing algorithms for explaining the output of image classifiers use different definitions of explanations and a variety of techniques to find them. However, none of the existing tools use a principled approach based on formal definitions of cause and explanation. In this paper we present a novel black-box approach to computing explanations grounded in the theory of actual causality. We prove relevant theoretical results and present an algorithm for computing approximate explanations based on these definitions. We prove termination of our algorithm and discuss its complexity and the amount of approximation compared to the precise definition. We implemented the framework in a tool, ReX, and we present experimental results and a comparison with state-of-the-art tools. We demonstrate that ReX is the most efficient black-box tool and produces the smallest explanations, in addition to outperforming other black-box tools on standard quality measures.
Hana Chockler, David A. Kelly, Daniel Kroening, Youcheng Sun
J. Artif. Intell. Res.3
2025 Multiple Different Black Box Explanations for Image Classifiers
abstract
Existing explanation tools for image classifiers usually give only a single explanation for an image’s classification. For many images, however, image classifiers accept more than one explanation for the image label. These explanations are useful for analyzing the decision process of the classifier and for detecting errors. Thus, restricting the number of explanations to just one severely limits insight into the behavior of the classifier. In this paper, we describe an algorithm and a tool, MultiReX, for computing multiple explanations as the output of a black-box image classifier for a given image. Our algorithm uses a principled approach based on actual causality. We analyze its theoretical complexity and evaluate MultiReX against the state-of-the-art across three different models and three different datasets. We find that MultiReX finds more explanations and that these explanations are of higher quality.
Hana Chockler, David A. Kelly, Daniel Kroening
ECAI3
2025 VERT: Polyglot Verified Equivalent Rust Transpilation with Large Language Models
abstract
Rust is a programming language that combines memory safety and low-level control, providing C-like performance while guaranteeing the absence of undefined behaviors by default. Rust’s growing popularity has prompted research on correct and idiomatic transpiling of existing code-bases to Rust. Existing work falls into two categories: rule-based and large language model (LLM)-based. While rule-based approaches are theoretically sound, they often yield unidiomatic and unsafe Rust code, and are limited to few source languages, which hinders maintainability and industrial application. By contrast, LLM-based approaches, while providing no guarantees, are polyglot and typically produce more idiomatic and safe Rust code. In this work, we present VERT, a formally correct, polyglot Rust translator with more idiomatic outputs. VERT supports any language that compiles to Web Assembly. Using the Web Assembly compiler, VERT obtains an oracle Rust program. Leveraging the LLM, VERT generates an idiomatic candidate Rust program. This candidate is verified against the oracle with model-checking to ensure equivalence.
Aidan Z. H. Yang, Yoshiki Takashima, Brandon Paulsen, Josiah Dodds, Daniel Kroening
ASE5
2025 Let a Neural Network be Your Invariant
abstract
Safety verification ensures that a system avoids undesired behaviour. Liveness complements safety, ensuring that the system also achieves its desired objectives. A complete specification of functional correctness must combine both safety and liveness. Proving with mathematical certainty that a system satisfies a safety property demands presenting an appropriate inductive invariant of the system, whereas proving liveness requires showing a measure of progress witnessed by a ranking function. Neural model checking has recently introduced a data-driven approach to the formal verification of reactive systems, albeit focusing on ranking functions and thus addressing liveness properties only. In this paper, we extend and generalise neural model checking to additionally encompass inductive invariants and thus safety properties as well. Given a system and a linear temporal logic specification of safety and liveness, our approach alternates a learning and a checking component towards the construction of a provably sound neural certificate. Our new method introduces a neural certificate architecture that jointly represents inductive invariants as proofs of safety, and ranking functions as proofs of liveness. Moreover, our new architecture is amenable to training using constraint solvers, accelerating prior neural model checking work otherwise based on gradient descent. We experimentally demonstrate that our method is orders of magnitude faster than the state-of-the-art model checkers on pure liveness and combined safety and liveness verification tasks written in SystemVerilog, while enabling the verification of richer properties than was previously possible for neural model checking.
Mirco Giacobbe, Daniel Kroening, Abhinandan Pal, Michael Tautschnig
NeurIPS2
2025 Program Synthesis from Partial Traces
abstract
We present the first technique to synthesize programs that compose side-effecting functions, pure functions, and control flow, from partial traces containing records of only the side-effecting functions. This technique can be applied to synthesize API composing scripts from logs of calls made to those APIs, or a script from traces of system calls made by a workload, for example. All of the provided traces are positive examples, meaning that they describe desired behavior. Our approach does not require negative examples. Instead, it generalizes over the examples and uses cost metrics to prevent over-generalization. Because the problem is too complex for traditional monolithic program synthesis techniques, we propose a new combination of optimizing rewrites and syntax-guided program synthesis. The resulting program is correct by construction, so its output will always be able to reproduce the input traces. We evaluate the quality of the programs synthesized when considering various optimization metrics and the synthesizer’s efficiency on real-world benchmarks. The results show that our approach can generate useful real-world programs.
Margarida Ferreira, Victor Nicolet, Joey Dodds, Daniel Kroening
Proc. ACM Program. Lang.4
2025 Scalable, Validated Code Translation of Entire Projects using Large Language Models
abstract
Large language models (LLMs) show promise in code translation due to their ability to generate idiomatic code. However, a significant limitation when using LLMs for code translation is scalability: existing works have shown a drop in translation success rates for code exceeding around 100 lines. We overcome this limitation by developing a modular approach to translation, where we partition the code into small code fragments which can be translated independently and semantically validated (that is, by checking I/O equivalence). When this approach is applied naively, we discover that LLMs are unreliable when translating features of the source language that do not have a direct mapping to the target language, and that the LLM often gets stuck in repair loops when attempting to fix errors. To address these issues, we introduce two key concepts: (1) feature mapping , which integrates predefined translation rules with LLM-based translation to guide the LLM in navigating subtle language differences and producing semantically accurate code; and (2) type-compatibility , which facilitates localized checks at the function signature level to detect errors early, thereby narrowing the scope of potential repairs. We apply our approach to translating real-world Go codebases to Rust, demonstrating that we can consistently generate reliable Rust translations for projects up to 9,700 lines of code and 780 functions, with an average of 73% of functions successfully validated for I/O equivalence, considerably higher than any existing work.
Hanliang Zhang, Cristina David, Meng Wang 0002, Brandon Paulsen, Daniel Kroening
Proc. ACM Program. Lang.5
2024 Safeguarded Progress in Reinforcement Learning: Safe Bayesian Exploration for Control Policy Synthesis
abstract
This paper addresses the problem of maintaining safety during training in Reinforcement Learning (RL), such that the safety constraint violations are bounded at any point during learning. As enforcing safety during training might severely limit the agent’s exploration, we propose here a new architecture that handles the trade-off between efficient progress and safety during exploration. As the exploration progresses, we update via Bayesian inference Dirichlet-Categorical models of the transition probabilities of the Markov decision process that describes the environment dynamics. We then propose a way to approximate moments of belief about the risk associated to the action selection policy. We demonstrate that this approach can be easily interleaved with RL and we present experimental results to showcase the performance of the overall architecture.
Rohan Mitta, Hosein Hasanbeig, Jun Wang 0135, Daniel Kroening, Yiannis Kantaros, Alessandro Abate
AAAI4
2024 Neural Model Checking
abstract
We introduce a machine learning approach to model checking temporal logic, with application to formal hardware verification. Model checking answers the question of whether every execution of a given system satisfies a desired temporal logic specification. Unlike testing, model checking provides formal guarantees. Its application is expected standard in silicon design and the EDA industry has invested decades into the development of performant symbolic model checking algorithms. Our new approach combines machine learning and symbolic reasoning by using neural networks as formal proof certificates for linear temporal logic. We train our neural certificates from randomly generated executions of the system and we then symbolically check their validity using satisfiability solving which, upon the affirmative answer, establishes that the system provably satisfies the specification. We leverage the expressive power of neural networks to represent proof certificates as well as the fact that checking a certificate is much simpler than finding one. As a result, our machine learning procedure for model checking is entirely unsupervised, formally sound, and practically effective. We experimentally demonstrate that our method outperforms the state-of-the-art academic and commercial model checkers on a set of standard hardware designs written in SystemVerilog.
Mirco Giacobbe, Daniel Kroening, Abhinandan Pal, Michael Tautschnig
NeurIPS2
2024 Symbolic Task Inference in Deep Reinforcement Learning
abstract
This paper proposes DeepSynth, a method for effective training of deep reinforcement learning agents when the reward is sparse or non-Markovian, but at the same time progress towards the reward requires achieving an unknown sequence of high-level objectives. Our method employs a novel algorithm for synthesis of compact finite state automata to uncover this sequential structure automatically. We synthesise a human-interpretable automaton from trace data collected by exploring the environment. The state space of the environment is then enriched with the synthesised automaton, so that the generation of a control policy by deep reinforcement learning is guided by the discovered structure encoded in the automaton. The proposed approach is able to cope with both high-dimensional, low-level features and unknown sparse or non-Markovian rewards. We have evaluated DeepSynth’s performance in a set of experiments that includes the Atari game Montezuma’s Revenge, known to be challenging. Compared to approaches that rely solely on deep reinforcement learning, we obtain a reduction of two orders of magnitude in the iterations required for policy synthesis, and a significant improvement in scalability.
Hosein Hasanbeig, Natasha Yogananda Jeppu, Alessandro Abate, Tom Melham, Daniel Kroening
J. Artif. Intell. Res.5
2023 Certified reinforcement learning with logic guidance
Hosein Hasanbeig, Daniel Kroening, Alessandro Abate
Artif. Intell.2
2023 Synthesising Programs with Non-trivial Constants
abstract
Abstract Program synthesis is the mechanised construction of software. One of the main difficulties is the efficient exploration of the very large solution space, and tools often require a user-provided syntactic restriction of the search space. While useful in general, such syntactic restrictions provide little help for the generation of programs that contain non-trivial constants, unless the user is able to provide the constants in advance. This is a fundamentally difficult task for state-of-the-art synthesisers. We propose a new approach to the synthesis of programs with non-trivial constants that combines the strengths of a counterexample-guided inductive synthesiser with those of a theory solver, exploring the solution space more efficiently without relying on user guidance. We call this approach CEGIS( $$\mathcal {T}$$ T ), where $$\mathcal {T}$$ T is a first-order theory. We present two exemplars, one based on Fourier-Motzkin (FM) variable elimination and one based on first-order satisfiability. We demonstrate the practical value of CEGIS( $$\mathcal {T}$$ T ) by automatically synthesising programs for a set of intricate benchmarks. Additionally, we present a case study where we integrate CEGIS( $$\mathcal {T}$$ T ) within the mature synthesiser CVC4 and show that CEGIS( $$\mathcal {T}$$ T ) improves CVC4’s results.
Alessandro Abate, Haniel Barbosa, Clark W. Barrett, Cristina David, Pascal Kesseli, Daniel Kroening, Elizabeth Polgreen, Andrew Reynolds 0001, Cesare Tinelli
J. Autom. Reason.6
2022 Active Learning of Abstract System Models from Traces using Model Checking
abstract
We present a new active model-learning approach to generating abstractions of a system implementation, as finite state automata (FSAs), from execution traces. Given an implementation and a set of observable system variables, the generated automata admit all system behaviours over the given variables and provide useful insight in the form of invariants that hold on the implementation. To achieve this, the proposed approach uses a pluggable model learning component that can generate an FSA from a given set of traces. Conditions that encode a completeness hypothesis are then extracted from the FSA under construction and used to evaluate its degree of completeness by checking their truth value against the system using software model checking. This generates new traces that express any missing behaviours. The new trace data is used to iteratively refine the abstraction, until all system behaviours are admitted by the learned abstraction. To evaluate the approach, we reverse-engineer a set of publicly available Simulink Stateflow models from their C implementations.
Natasha Yogananda Jeppu, Tom Melham, Daniel Kroening
DATE3
2022 Neural termination analysis
abstract
We introduce a novel approach to the automated termination analysis of computer programs: we use neural networks to represent ranking functions. Ranking functions map program states to values that are bounded from below and decrease as a program runs; the existence of a ranking function proves that the program terminates. We train a neural network from sampled execution traces of a program so that the network's output decreases along the traces; then, we use symbolic reasoning to formally verify that it generalises to all possible executions. Upon the affirmative answer we obtain a formal certificate of termination for the program, which we call a neural ranking function. We demonstrate that, thanks to the ability of neural networks to represent nonlinear functions, our method succeeds over programs that are beyond the reach of state-of-the-art tools. This includes programs that use disjunctions in their loop conditions and programs that include nonlinear expressions.
Mirco Giacobbe, Daniel Kroening, Julian Parsert
ESEC/SIGSOFT FSE2
2022 Enhancing active model learning with equivalence checking using simulation relations
abstract
Abstract We present a new active model-learning approach to generating abstractions of a system from its execution traces. Given a system and a set of observables to collect execution traces, the abstraction produced by the algorithm is guaranteed to admit all system traces over the set of observables. To achieve this, the approach uses a pluggable model-learning component that can generate a model from a given set of traces. Conditions that encode a certain completeness hypothesis, formulated based on simulation relations, are then extracted from the abstraction under construction and used to evaluate its degree of completeness. The extracted conditions are sufficient to prove model completeness but not necessary. If all conditions are true, the algorithm terminates, returning a system overapproximation. A condition falsification may not necessarily correspond to missing system behaviour in the abstraction. This is resolved by applying model checking to determine whether it corresponds to any concrete system trace. If so, the new concrete trace is used to iteratively learn new abstractions, until all extracted completeness conditions are true. To evaluate the approach, we reverse-engineer a set of publicly available Simulink Stateflow models from their C implementations. Our algorithm generates an equivalent model for 98% of the Stateflow models.
Natasha Yogananda Jeppu, Tom Melham, Daniel Kroening
Formal Methods Syst. Des.3
2021 DeepSynth: Automata Synthesis for Automatic Task Segmentation in Deep Reinforcement Learning
abstract
This paper proposes DeepSynth, a method for effective training of deep Reinforcement Learning (RL) agents when the reward is sparse and non-Markovian, but at the same time progress towards the reward requires achieving an unknown sequence of high-level objectives. Our method employs a novel algorithm for synthesis of compact automata to uncover this sequential structure automatically. We synthesise a human-interpretable automaton from trace data collected by exploring the environment. The state space of the environment is then enriched with the synthesised automaton so that the generation of a control policy by deep RL is guided by the discovered structure encoded in the automaton. The proposed approach is able to cope with both high-dimensional, low-level features and unknown sparse non-Markovian rewards. We have evaluated DeepSynth's performance in a set of experiments that includes the Atari game Montezuma's Revenge. Compared to existing approaches, we obtain a reduction of two orders of magnitude in the number of iterations required for policy synthesis, and also a significant improvement in scalability.
Mohammadhosein Hasanbeig, Natasha Yogananda Jeppu, Alessandro Abate, Tom Melham, Daniel Kroening
AAAI5
2021 Explanations for Occluded Images
abstract
Existing algorithms for explaining the output of image classifiers perform poorly on inputs where the object of interest is partially occluded. We present a novel, black-box algorithm for computing explanations that uses a principled approach based on causal theory. We have implemented the method in the DEEPCOVER tool. We obtain explanations that are much more accurate than those generated by the existing explanation tools on images with occlusions and observe a level of performance comparable to the state of the art when explaining images without occlusions.
Hana Chockler, Daniel Kroening, Youcheng Sun
ICCV2
2021 Exposing previously undetectable faults in deep neural networks
abstract
Existing methods for testing DNNs solve the oracle problem by constraining the raw features (e.g. image pixel values) to be within a small distance of a dataset example for which the desired DNN output is known. But this limits the kinds of faults these approaches are able to detect. In this paper, we introduce a novel DNN testing method that is able to find faults in DNNs that other methods cannot. The crux is that, by leveraging generative machine learning, we can generate fresh test inputs that vary in their high-level features (for images, these include object shape, location, texture, and colour). We demonstrate that our approach is capable of detecting deliberately injected faults as well as new faults in state-of-the-art DNNs, and that in both cases, existing methods are unable to find these faults.
Isaac Dunn, Hadrien Pouget, Daniel Kroening, Tom Melham
ISSTA3
2021 Ranking Policy Decisions
abstract
Policies trained via Reinforcement Learning (RL) without human intervention are often needlessly complex, making them difficult to analyse and interpret. In a run with $n$ time steps, a policy will make $n$ decisions on actions to take; we conjecture that only a small subset of these decisions delivers value over selecting a simple default action. Given a trained policy, we propose a novel black-box method based on statistical fault localisation that ranks the states of the environment according to the importance of decisions made in those states. We argue that among other things, the ranked list of states can help explain and understand the policy. As the ranking method is statistical, a direct evaluation of its quality is hard. As a proxy for quality, we use the ranking to create new, simpler policies from the original ones by pruning decisions identified as unimportant (that is, replacing them by default actions) and measuring the impact on performance. Our experimental results on a diverse set of standard benchmarks demonstrate that pruned policies can perform on a level comparable to the original policies. We show that naive approaches for ranking policies, e.g. ranking based on the frequency of visiting a state, do not result in high-performing pruned policies. To the best of our knowledge, there are no similar techniques for ranking RL policies' decisions.
Hadrien Pouget, Hana Chockler, Youcheng Sun, Daniel Kroening
NeurIPS4
2021 Model checking boot code from AWS data centers
abstract
Abstract This paper describes our experience with symbolic model checking in an industrial setting. We have proved that the initial boot code running in data centers at Amazon Web Services is memory safe, an essential step in establishing the security of any data center. Standard static analysis tools cannot be easily used on boot code without modification owing to issues not commonly found in higher-level code, including memory-mapped device interfaces, byte-level memory access, and linker scripts. This paper describes automated solutions to these issues and their implementation in the C Bounded Model Checker (CBMC). CBMC is now the first source-level static analysis tool to extract the memory layout described in a linker script for use in its analysis.
Byron Cook, Kareem Khazem, Daniel Kroening, Serdar Tasiran, Michael Tautschnig, Mark R. Tuttle
Formal Methods Syst. Des.3
2021 Unbounded-Time Safety Verification of Guarded LTI Models with Inputs by Abstract Acceleration
abstract
Reachability analysis of dynamical models is a relevant problem that has seen much progress in the last decades, however with clear limitations pertaining to the nature of the dynamics and the soundness of the results. This article focuses on sound safety verification of unbounded-time (infinite-horizon) linear time-invariant (LTI) models with inputs using reachability analysis. We achieve this using counterexample-guided Abstract Acceleration: this approach over-approximates the reachability tube of the LTI model over an unbounded time horizon by using abstraction, possibly finding concrete counterexamples for refinement based on the given safety specification. The technique is applied to a number of LTI models and the results show robust performance when compared to state-of-the-art tools.
Dario Cattaruzza, Alessandro Abate, Peter Schrammel, Daniel Kroening
J. Autom. Reason.4
2020 The Taint Rabbit: Optimizing Generic Taint Analysis with Dynamic Fast Path Generation
abstract
Generic taint analysis is a pivotal technique in software security. However, it suffers from staggeringly high overhead. In this paper, we explore the hypothesis whether just-in-time (JIT) generation of fast paths for tracking taint can enhance the performance. To this end, we present the Taint Rabbit, which supports highly customizable user-defined taint policies and combines a JIT with fast context switching. Our experimental results suggest that this combination outperforms notable existing implementations of generic taint analysis and bridges the performance gap to specialized trackers. For instance, Dytan incurs an average overhead of 237x, while the Taint Rabbit achieves 1.7x on the same set of benchmarks. This compares favorably to the 1.5x overhead delivered by the bitwise, non-generic, taint engine LibDFT.
John Galea, Daniel Kroening
AsiaCCS2
2020 Learning Concise Models from Long Execution Traces
abstract
Abstract models of system-level behaviour have applications in design exploration, analysis, testing and verification. We describe a new algorithm for automatically extracting useful models, as automata, from execution traces of a HW/SW system driven by software exercising a use-case of interest. Our algorithm leverages modern program synthesis techniques to generate predicates on automaton edges, succinctly describing system behaviour. It employs trace segmentation to tackle complexity for long traces. We learn concise models capturing transaction-level, system-wide behaviour-experimentally demonstrating the approach using traces from a variety of sources, including the x86 QEMU virtual platform and the Real-Time Linux kernel.
Natasha Yogananda Jeppu, Tom Melham, Daniel Kroening, John O'Leary
DAC3
2020 Explaining Image Classifiers Using Statistical Fault Localization
Youcheng Sun, Hana Chockler, Xiaowei Huang 0001, Daniel Kroening
ECCV (28)4
2020 Using model checking tools to triage the severity of security bugs in the Xen hypervisor
abstract
In practice, few security bugs found in source code are urgent, but quickly identifying which ones are is hard.We describe the application of bounded model checking to triaging reported issues quickly at the cloud service provider Amazon Web Services (AWS).We focus on the job of reactive security experts who need to determine the severity of bugs found in the Xen hypervisor.We show that, using our publicly available extensions to the model checker CBMC, a security expert can obtain traces to construct security tests and estimate the severity of the reported finding within 15 minutes.We believe that the changes made to the model checker, as well as the methodology for using tools in this scenario, will generalise to other organisations and environments.
Byron Cook, Björn Döbel, Daniel Kroening, Norbert Manthey, Martin Pohlack, Elizabeth Polgreen, Michael Tautschnig, Pawel Wieczorkiewicz
FMCAD3
2020 Automated formal synthesis of provably safe digital controllers for continuous plants
abstract
We present a sound and automated approach to synthesizing safe, digital controllers for physical plants represented as time-invariant models. Models are linear differential equations with inputs, evolving over a continuous state space. The synthesis precisely accounts for the effects of finite-precision arithmetic introduced by the controller. The approach uses counterexample-guided inductive synthesis: an inductive generalization phase produces a controller that is known to stabilize the model but that may not be safe for all initial conditions of the model. Safety is then verified via bounded model checking: if the verification step fails, a counterexample is provided to the inductive generalization, and the process further iterates until a safe controller is obtained. We demonstrate the practical value of this approach by automatically synthesizing safe controllers for physical plant models from the digital control literature.
Alessandro Abate, Iury Bessa, Lucas C. Cordeiro, Cristina David, Pascal Kesseli, Daniel Kroening, Elizabeth Polgreen
Acta Informatica6
2020 Learning the Language of Software Errors
abstract
We propose to use algorithms for learning deterministic finite automata (DFA), such as Angluin’s L* algorithm, for learning a DFA that describes the possible scenarios under which a given program error occurs. The alphabet of this automaton is given by the user (for instance, a subset of the function call sites or branches), and hence the automaton describes a user-defined abstraction of those scenarios. More generally, the same technique can be used for visualising the behavior of a program or parts thereof. It can also be used for visually comparing different versions of a program (by presenting an automaton for the behavior in the symmetric difference between them), and for assisting in merging several development branches. We present experiments that demonstrate the power of an abstract visual representation of errors and of program segments, accessible via the project’s web page. In addition, our experiments in this paper demonstrate that such automata can be learned efficiently over real-world programs. We also present lazy learning, which is a method for reducing the number of membership queries while using L*, and demonstrate its effectiveness on standard benchmarks.
Hana Chockler, Pascal Kesseli, Daniel Kroening, Ofer Strichman
J. Artif. Intell. Res.3
2019 Gollum: Modular and Greybox Exploit Generation for Heap Overflows in Interpreters
abstract
We present the first approach to automatic exploit generation for heap overflows in interpreters. It is also the first approach to exploit generation in any class of program that integrates a solution for automatic heap layout manipulation. At the core of the approach is a novel method for discovering exploit primitives---inputs to the target program that result in a sensitive operation, such as a function call or a memory write, utilizing attacker-injected data. To produce an exploit primitive from a heap overflow vulnerability, one has to discover a target data structure to corrupt, ensure an instance of that data structure is adjacent to the source of the overflow on the heap, and ensure that the post-overflow corrupted data is used in a manner desired by the attacker. Our system addresses all three tasks in an automatic, greybox, and modular manner. Our implementation is called GOLLUM, and we demonstrate its capabilities by producing exploits from 10 unique vulnerabilities in the PHP and Python interpreters, 5 of which do not have existing public exploits.
Sean Heelan, Tom Melham, Daniel Kroening
CCS3
2019 Global Robustness Evaluation of Deep Neural Networks with Provable Guarantees for the Hamming Distance
abstract
Deployment of deep neural networks (DNNs) in safety-critical systems requires provable guarantees for their correct behaviours. We compute the maximal radius of a safe norm ball around a given input, within which there are no adversarial examples for a trained DNN. We define global robustness as an expectation of the maximal safe radius over a test dataset, and develop an algorithm to approximate the global robustness measure by iteratively computing its lower and upper bounds. Our algorithm is the first efficient method for the Hamming (L0) distance, and we hypothesise that this norm is a good proxy for a certain class of physical attacks. The algorithm is anytime, i.e., it returns intermediate bounds and robustness estimates that are gradually, but strictly, improved as the computation proceeds; tensor-based, i.e., the computation is conducted over a set of inputs simultaneously to enable efficient GPU computation; and has provable guarantees, i.e., both the bounds and the robustness estimates can converge to their optimal values. Finally, we demonstrate the utility of our approach by applying the algorithm to a set of challenging problems.
Wenjie Ruan, Min Wu 0011, Youcheng Sun, Xiaowei Huang 0001, Daniel Kroening, Marta Z. Kwiatkowska
IJCAI5
2019 JBMC: Bounded Model Checking for Java Bytecode - (Competition Contribution)
abstract
JBMC is a bounded model checking tool for verifying Java bytecode. It is built on top of the CPROVER framework. JBMC processes Java bytecode together with a model of the standard Java libraries. It checks a set of desired properties, such as assertions and absence of uncaught exceptions, under given bounds on loops, recursion and data structures. Internally, it uses the same bounded model checking engine as its sibling tool CBMC and discharges the generated verification conditions with the help of MiniSAT 2.2.1.
Lucas C. Cordeiro, Daniel Kroening, Peter Schrammel
TACAS (3)2
2019 Structural Test Coverage Criteria for Deep Neural Networks
abstract
Deep neural networks (DNNs) have a wide range of applications, and software employing them must be thoroughly tested, especially in safety-critical domains. However, traditional software test coverage metrics cannot be applied directly to DNNs. In this paper, inspired by the MC/DC coverage criterion, we propose a family of four novel test coverage criteria that are tailored to structural features of DNNs and their semantics. We validate the criteria by demonstrating that test inputs that are generated with guidance by our proposed coverage criteria are able to capture undesired behaviours in a DNN. Test cases are generated using a symbolic approach and a gradient-based heuristic search. By comparing them with existing methods, we show that our criteria achieve a balance between their ability to find bugs (proxied using adversarial examples and correlation with functional coverage) and the computational cost of test input generation. Our experiments are conducted on state-of-the-art DNNs obtained using popular open source datasets, including MNIST, CIFAR-10 and ImageNet.
Youcheng Sun, Xiaowei Huang 0001, Daniel Kroening, James Sharp, Matthew Hill, Rob Ashmore
ACM Trans. Embed. Comput. Syst.3
2018 Counterexample Guided Inductive Synthesis Modulo Theories
abstract
Program synthesis is the mechanised construction of software. One of the main difficulties is the efficient exploration of the very large solution space, and tools often require a user-provided syntactic restriction of the search space. We propose a new approach to program synthesis that combines the strengths of a counterexample-guided inductive synthesizer with those of a theory solver, exploring the solution space more efficiently without relying on user guidance. We call this approach CEGIS( $$\mathcal {T}$$ ), where $$\mathcal {T}$$ is a first-order theory. In this paper, we focus on one particular challenge for program synthesizers, namely the generation of programs that require non-trivial constants. This is a fundamentally difficult task for state-of-the-art synthesizers. We present two exemplars, one based on Fourier-Motzkin (FM) variable elimination and one based on first-order satisfiability. We demonstrate the practical value of CEGIS( $$\mathcal {T}$$ ) by automatically synthesizing programs for a set of intricate benchmarks.
Alessandro Abate, Cristina David, Pascal Kesseli, Daniel Kroening, Elizabeth Polgreen
CAV (1)4
2018 Model Checking Boot Code from AWS Data Centers
abstract
This paper describes our experience with symbolic model checking in an industrial setting. We have proved that the initial boot code running in data centers at Amazon Web Services is memory safe, an essential step in establishing the security of any data center. Standard static analysis tools cannot be easily used on boot code without modification owing to issues not commonly found in higher-level code, including memory-mapped device interfaces, byte-level memory access, and linker scripts. This paper describes automated solutions to these issues and their implementation in the C Bounded Model Checker (CBMC). CBMC is now the first source-level static analysis tool to extract the memory layout described in a linker script for use in its analysis. These keywords were added by machine and not by the authors. This process is experimental and the keywords may be updated as the learning algorithm improves.
Byron Cook, Kareem Khazem, Daniel Kroening, Serdar Tasiran, Michael Tautschnig, Mark R. Tuttle
CAV (2)3
2018 JBMC: A Bounded Model Checking Tool for Verifying Java Bytecode
abstract
We present a bounded model checking tool for verifying Java bytecode, which is built on top of the CPROVER framework, named Java Bounded Model Checker (JBMC). JBMC processes Java bytecode together with a model of the standard Java libraries and checks a set of desired properties. Experimental results show that JBMC can correctly verify a set of Java benchmarks from the literature and that it is competitive with two state-of-the-art Java verifiers. These keywords were added by machine and not by the authors. This process is experimental and the keywords may be updated as the learning algorithm improves.
Lucas C. Cordeiro, Pascal Kesseli, Daniel Kroening, Peter Schrammel, Marek Trtík
CAV (1)3
2018 Efficient verification of multi-property designs (The benefit of wrong assumptions)
abstract
We consider the problem of efficiently checking a set of safety properties P1,...,Pkof one design. We introduce a new approach called JA-verification, where JA stands for “JustAssume” (as opposed to “assume-guarantee”). In this approach, when proving a property Pi, one assumes that every property Pjfor j ≠ i holds. The process of proving properties either results in showing that P1,...,Pkhold without any assumptions or finding a “debugging set” of properties. The latter identifies a subset of failed properties that are the first to break. The design behaviors that cause the properties in the debugging set to fail must be fixed first. Importantly, in our approach, there is no need to prove the assumptions used. We describe the theory behind our approach and report experimental results that demonstrate substantial gains in performance, especially in the cases where a small debugging set exists.
Eugene Goldberg, Matthias Güdemann, Daniel Kroening, Rajdeep Mukherjee
DATE3
2018 Verification of tree-based hierarchical read-copy update in the Linux kernel
abstract
Read-Copy Update (RCU) is a scalable, high-performance Linux-kernel synchronization mechanism that runs low-overhead readers concurrently with updaters. Production-quality RCU implementations are decidedly non-trivial and their stringent validation is mandatory. This suggests use of formal verification. Previous formal verification efforts for RCU either focus on simple implementations or use modeling languages. In this paper, we construct a model directly from the source code of Tree RCU in the Linux kernel, and use the CBMC program analyzer to verify its safety and liveness properties. To the best of our knowledge, this is the first verification of a significant part of RCU's source code - an important step towards integration of formal verification into the Linux kernel's regression test suite.
Lihao Liang, Paul E. McKenney, Daniel Kroening, Tom Melham
DATE3
2018 Optimising Spectrum Based Fault Localisation for Single Fault Programs Using Specifications
abstract
Spectrum based fault localisation determines how suspicious a line of code is with respect to being faulty as a function of a given test suite. Outstanding problems include identifying properties that the test suite should satisfy in order to improve fault localisation effectiveness subject to a given measure, and developing methods that generate these test suites efficiently. We address these problems as follows. First, when single bug optimal measures are being used with a single-fault program, we identify a formal property that the test suite should satisfy in order to optimise fault localisation. Second, we introduce a new method which generates test data that satisfies this property. Finally, we empirically demonstrate the utility of our implementation at fault localisation on sv-comp benchmarks and the tcas program, demonstrating that test suites can be generated in almost a second with a fault identified after inspecting under 1% of the program.
David Landsberg, Youcheng Sun, Daniel Kroening
FASE3
2018 DSValidator: An Automated Counterexample Reproducibility Tool for Digital Systems
abstract
We present an automated counterexample reproducibility tool based on MATLAB, called DSValidator, with the goal of reproducing counterexamples that refute specific properties related to digital systems. We exploit counterexamples generated by the Digital System Verifier (DSVerifier), which is a model checking tool based on satisfiability modulo theories for digital systems. DSValidator reproduces the execution of a digital system, relating its input with the counterexample, in order to establish trust in a verification result. We show that DSValidator can validate a set of intricate counterexamples for digital controllers used in a real quadrotor attitude system within seconds and also expose incorrect verification results in DSVerifier. The resulting toolbox leverages the potential of combining different verification tools for validating digital systems via an exchangeable counterexample format.
Lennon C. Chaves, Iury Bessa, Lucas C. Cordeiro, Daniel Kroening
HSCC4
2018 Concolic testing for deep neural networks
abstract
Concolic testing combines program execution and symbolic analysis to explore the execution paths of a software program. In this paper, we develop the first concolic testing approach for Deep Neural Networks (DNNs). More specifically, we utilise quantified linear arithmetic over rationals to express test requirements that have been studied in the literature, and then develop a coherent method to perform concolic testing with the aim of better coverage. Our experimental results show the effectiveness of the concolic testing approach in both achieving high coverage and finding adversarial examples.
Youcheng Sun, Min Wu 0011, Wenjie Ruan, Xiaowei Huang 0001, Marta Z. Kwiatkowska, Daniel Kroening
ASE6
2018 Automatic Heap Layout Manipulation for Exploitation
Sean Heelan, Tom Melham, Daniel Kroening
USENIX Security Symposium3
2018 Effective Verification for Low-Level Software with Competing Interrupts
abstract
Interrupt-driven software is difficult to test and debug, especially when interrupts can be nested and subject to priorities. Interrupts can arrive at arbitrary times, leading to an exponential blow-up in the number of cases to consider. We present a new formal approach to verifying interrupt-driven software based on symbolic execution. The approach leverages recent advances in the encoding of the execution traces of interacting, concurrent threads. We assess the performance of our method on benchmarks drawn from embedded systems code and device drivers, and experimentally compare it to conventional approaches that use source-to-source transformations. Our results show that our method significantly outperforms these techniques. To the best of our knowledge, our work is the first to demonstrate effective verification of low-level embedded software with nested interrupts.
Lihao Liang, Tom Melham, Daniel Kroening, Peter Schrammel, Michael Tautschnig
ACM Trans. Embed. Comput. Syst.3
2018 Bit-Precise Procedure-Modular Termination Analysis
abstract
Non-termination is the root cause of a variety of program bugs, such as hanging programs and denial-of-service vulnerabilities. This makes an automated analysis that can prove the absence of such bugs highly desirable. To scale termination checks to large systems, an interprocedural termination analysis seems essential. This is a largely unexplored area of research in termination analysis, where most effort has focussed on small but difficult single-procedure problems. We present a modular termination analysis for C programs using template-based interprocedural summarisation. Our analysis combines a context-sensitive, over-approximating forward analysis with the inference of under-approximating preconditions for termination. Bit-precise termination arguments are synthesised over lexicographic linear ranking function templates. Our experimental results show the advantage of interprocedural reasoning over monolithic analysis in terms of efficiency, while retaining comparable precision.
Hong-Yi Chen, Cristina David, Daniel Kroening, Peter Schrammel, Björn Wachter
ACM Trans. Program. Lang. Syst.3
2018 Program Synthesis for Program Analysis
abstract
In this article, we propose a unified framework for designing static analysers based on program synthesis . For this purpose, we identify a fragment of second-order logic with restricted quantification that is expressive enough to model numerous static analysis problems (e.g., safety proving, bug finding, termination and non-termination proving, refactoring). As our focus is on programs that use bit-vectors, we build a decision procedure for this fragment over finite domains in the form of a program synthesiser. We provide instantiations of our framework for solving a diverse range of program verification tasks such as termination, non-termination, safety and bug finding, superoptimisation, and refactoring. Our experimental results show that our program synthesiser compares positively with specialised tools in each area as well as with general-purpose synthesisers.
Cristina David, Pascal Kesseli, Daniel Kroening, Matt Lewis
ACM Trans. Program. Lang. Syst.3
2017 Lifting CDCL to Template-Based Abstract Domains for Program Verification
Rajdeep Mukherjee, Peter Schrammel, Leopold Haller, Daniel Kroening, Tom Melham
ATVA4
2017 Automated Formal Synthesis of Digital Controllers for State-Space Physical Plants
Alessandro Abate, Iury Bessa, Dario Cattaruzza, Lucas C. Cordeiro, Cristina David, Pascal Kesseli, Daniel Kroening, Elizabeth Polgreen
CAV (1)7
2017 Abstract Interpretation with Unfoldings
Marcelo Sousa, César Rodríguez, Vijay Victor D'Silva, Daniel Kroening
CAV (2)4
2017 Formal Techniques for Effective Co-verification of Hardware/Software Co-designs
abstract
Verification is indispensable for building reliable of hardware/software co-designs. However, the scope of formal methods in this domain is limited. This is attributed to the lack of unified property specification languages, the semantic gap between hardware and software components, and the lack of verifiers that support both C and Verilog/VHDL. To address these limitations, we present an approach that uses a bounded co-verification tool, HW-CBMC, for formally validating hardware/software co-designs written in Verilog and C. Properties are expressed in C enriched with special-purpose primitives that capture temporal correlation between hardware and software events. We present an industrial case-study, proving bounded safety properties as well as discovering critical co-design bugs on a large and complex text analytics FPGA accelerator from IBM®.
Rajdeep Mukherjee, Mitra Purandare, Raphael Polig, Daniel Kroening
DAC4
2017 Sound and Automated Synthesis of Digital Stabilizing Controllers for Continuous Plants
abstract
Modern control is implemented with digital microcontrollers, embedded within a dynamical plant that represents physical components. We present a new algorithm based on counterexample guided inductive synthesis that automates the design of digital controllers that are correct by construction. The synthesis result is sound with respect to the complete range of approximations, including time discretization, quantization effects, and finite-precision arithmetic and its rounding errors. We have implemented our new algorithm in a tool called DSSynth, and are able to automatically generate stable controllers for a set of intricate plant models taken from the literature within minutes.
Alessandro Abate, Iury Bessa, Dario Cattaruzza, Lucas C. Cordeiro, Cristina David, Pascal Kesseli, Daniel Kroening
HSCC7
2017 Functional Requirements-Based Automated Testing for Avionics
abstract
We propose and demonstrate a method for the reduction of testing effort in safety-critical software development using DO-178 guidance. We achieve this through the application of Bounded Model Checking (BMC) to formal low-level requirements, in order to generate tests automatically that are good enough to replace existing labor-intensive test writing procedures while maintaining independence from implementation artefacts. Given that manual processes are often empirical and subjective, we begin by formally defining a metric, which extends recognized best practice from code coverage analysis strategies to generate tests that adequately cover the requirements. We then implement it in an automated requirements testing procedure and apply it in a case study with industrial partners. In review, the toolchain developed here is demonstrated to significantly reduce the human effort for the qualification of software products under DO-178 guidance.
Youcheng Sun, Martin Brain, Daniel Kroening, Andrew Hawthorn, Thomas Wilson, Florian Schanda, Francisco Javier Guzman Jimenez, Simon Daniel, Chris Bryan, Ian Broster
ICECCS3
2017 Verifying digital systems with MATLAB
abstract
A MATLAB toolbox is presented, with the goal of checking occurrences of design errors typically found in fixed-point digital systems, considering finite word-length effects. In particular, the present toolbox works as a front-end to a recently introduced verification tool, known as Digital-System Verifier (DSVerifier), and checks overflow, limit cycle, quantization, stability, and minimum phase errors in digital systems represented by transfer-function and state-space equations. It provides a command-line version with simplified access to specific functionality and a graphical-user interface, which was developed as a MATLAB application. The resulting toolbox enables application of verification to real-world systems by control engineers.
Lennon C. Chaves, Iury Bessa, Lucas C. Cordeiro, Daniel Kroening, Eddie Batista de Lima Filho
ISSTA4
2017 DSSynth: an automated digital controller synthesis tool for physical plants
abstract
We present an automated MATLAB Toolbox, named DSSynth (Digital-System Synthesizer), to synthesize sound digital controllers for physical plants that are represented as linear timeinvariant systems with single input and output. In particular, DSSynth synthesizes digital controllers that are sound w.r.t. stability and safety specifications. DSSynth considers the complete range of approximations, including time discretization, quantization effects and finite-precision arithmetic (and its rounding errors). We demonstrate the practical value of this toolbox by automatically synthesizing stable and safe controllers for intricate physical plant models from the digital control literature. The resulting toolbox enables the application of program synthesis to real-world control engineering problems. A demonstration can be found at https://youtu.be_hLQslRcee8.
Alessandro Abate, Iury Bessa, Dario Cattaruzza, Lennon C. Chaves, Lucas C. Cordeiro, Cristina David, Pascal Kesseli, Daniel Kroening, Elizabeth Polgreen
ASE8
2017 Modular Demand-Driven Analysis of Semantic Difference for Program Versions
Anna Trostanetski, Orna Grumberg, Daniel Kroening
SAS3
2017 Independence Abstractions and Models of Concurrency
Vijay Victor D'Silva, Daniel Kroening, Marcelo Sousa
VMCAI2
2017 Incremental bounded model checking for embedded software
abstract
Abstract Program analysis is on the brink of mainstream usage in embedded systems development. Formal verification of behavioural requirements, finding runtime errors and test case generation are some of the most common applications of automated verification tools based on bounded model checking (BMC). Existing industrial tools for embedded software use an off-the-shelf bounded model checker and apply it iteratively to verify the program with an increasing number of unwindings. This approach unnecessarily wastes time repeating work that has already been done and fails to exploit the power of incremental SAT solving. This article reports on the extension of the software model checker C BMC to support incremental BMC and its successful integration with the industrial embedded software verification tool BTC E MBEDDED TESTER . We present an extensive evaluation over large industrial embedded programs, mainly from the automotive industry. We show that incremental BMC cuts runtimes by one order of magnitude in comparison to the standard non-incremental approach, enabling the application of formal verification to large and complex embedded software. We furthermore report promising results on analysing programs with arbitrary loop structure using incremental BMC, demonstrating its applicability and potential to verify general software beyond the embedded domain.
Peter Schrammel, Daniel Kroening, Martin Brain, Ruben Martins, Tino Teige, Tom Bienmüller
Formal Aspects Comput.2
2017 Lost in abstraction: Monotonicity in multi-threaded programs
Alexander Kaiser 0001, Daniel Kroening, Thomas Wahl
Inf. Comput.2
2017 Don't Sit on the Fence: A Static Analysis Approach to Automatic Fence Insertion
abstract
Modern architectures rely on memory fences to prevent undesired weakenings of memory consistency. As the fences’ semantics may be subtle, the automation of their placement is highly desirable. But precise methods for restoring consistency do not scale to deployed systems’ code. We choose to trade some precision for genuine scalability: our technique is suitable for large code bases. We implement it in our new musketeer tool and report experiments on more than 700 executables from packages found in Debian GNU/Linux 7.1, including memcached with about 10,000 LoC.
Jade Alglave, Daniel Kroening, Vincent Nimal, Daniel Poetzl
ACM Trans. Program. Lang. Syst.2
2017 Precise Predictive Analysis for Discovering Communication Deadlocks in MPI Programs
abstract
The Message Passing Interface (MPI) is the standard API for parallelization in high-performance and scientific computing. Communication deadlocks are a frequent problem in MPI programs, and this article addresses the problem of discovering such deadlocks. We begin by showing that if an MPI program is single path, the problem of discovering communication deadlocks is NP-complete. We then present a novel propositional encoding scheme that captures the existence of communication deadlocks. The encoding is based on modeling executions with partial orders and implemented in a tool called MOPPER . The tool executes an MPI program, collects the trace, builds a formula from the trace using the propositional encoding scheme, and checks its satisfiability. Finally, we present experimental results that quantify the benefit of the approach in comparison to other analyzers and demonstrate that it offers a scalable solution for single-path programs.
Vojtech Forejt, Saurabh Joshi 0001, Daniel Kroening, Ganesh Narayanaswamy, Subodh Sharma 0001
ACM Trans. Program. Lang. Syst.3
2016 Unbounded safety verification for hardware using software analyzers
Rajdeep Mukherjee, Peter Schrammel, Daniel Kroening, Tom Melham
DATE3
2016 Danger Invariants
Cristina David, Pascal Kesseli, Daniel Kroening, Matt Lewis
FM3
2016 Equivalence Checking of a Floating-Point Unit Against a High-Level C Model
Rajdeep Mukherjee, Saurabh Joshi 0001, Andreas Griesmayer, Daniel Kroening, Tom Melham
FM4
2016 Sound static deadlock analysis for C/Pthreads
abstract
We present a static deadlock analysis approach for C/pthreads. The design of our method has been guided by the requirement to analyse real-world code. Our approach is sound (i.e., misses no deadlocks) for programs that have defined behaviour according to the C standard and the pthreads specification, and is precise enough to prove deadlock-freedom for a large number of such programs. The method consists of a pipeline of several analyses that build on a new context- and thread-sensitive abstract interpretation framework. We further present a lightweight dependency analysis to identify statements relevant to deadlock analysis and thus speed up the overall analysis. In our experimental evaluation, we succeeded to prove deadlock-freedom for 292 programs from the Debian GNU/Linux distribution with in total 2.3 MLOC in 4 hours.
Daniel Kroening, Daniel Poetzl, Peter Schrammel, Björn Wachter
ASE1
2016 Static Program Analysis for Identifying Energy Bugs in Graphics-Intensive Mobile Apps
abstract
A major drawback of mobile devices is limited battery life. Apps that use graphics are especially energy greedy and developers must invest significant effort to make such apps energy efficient. We propose a novel static optimization technique for eliminating drawing commands to produce energy-efficient apps. The key insight we exploit is that the static analysis is able to predict future behavior of the app, and we give three exemplars that demonstrate the value of this approach. Firstly, loop invariant texture analysis identifies repetitive texture transfers in the render loop so that they can be moved out of the loop and performed just once. Secondly, packing identifies images that are drawn together and therefore can be combined into a larger image to eliminate overhead associated with multiple smaller images. Finally, identical frames detection uses a combination of static and dynamic analysis to identify frames that are identical to the previous frame and therefore do not have to be drawn. We implemented the technique against LibGDX, an Android game engine, and evaluated it using open source projects. Our experiments indicate savings up to 44% of the total energy consumption of the device.
Chang Hwan Peter Kim, Daniel Kroening, Marta Z. Kwiatkowska
MASCOTS2
2016 SC2: Satisfiability Checking Meets Symbolic Computation - (Project Paper)
Erika Ábrahám, John Abbott, Bernd Becker 0001, Anna Maria Bigatti, Martin Brain, Bruno Buchberger, Alessandro Cimatti, James H. Davenport, Matthew England 0001, Pascal Fontaine, Stephen Forrest, Alberto Griggio, Daniel Kroening, Werner M. Seiler, Thomas Sturm 0001
CICM13
2016 The virtues of conflict: analysing modern concurrency
abstract
Modern shared memory multiprocessors permit reordering of memory operations for performance reasons. These reorderings are often a source of subtle bugs in programs written for such architectures. Traditional approaches to verify weak memory programs often rely on interleaving semantics, which is prone to state space explosion, and thus severely limits the scalability of the analysis. In recent times, there has been a renewed interest in modelling dynamic executions of weak memory programs using partial orders. However, such an approach typically requires ad-hoc mechanisms to correctly capture the data and control-flow choices/conflicts present in real-world programs. In this work, we propose a novel, conflict-aware, composable, truly concurrent semantics for programs written using C/C++ for modern weak memory architectures. We exploit our symbolic semantics based on general event structures to build an efficient decision procedure that detects assertion violations in bounded multi-threaded programs. Using a large, representative set of benchmarks, we show that our conflict-aware semantics outperforms the state-of-the-art partial-order based approaches.
Ganesh Narayanaswamy, Saurabh Joshi 0001, Daniel Kroening
PPoPP3
2016 v2c - A Verilog to C Translator
Rajdeep Mukherjee, Michael Tautschnig, Daniel Kroening
TACAS3
2016 Formalizing and Checking Thread Refinement for Data-Race-Free Execution Models
Daniel Poetzl, Daniel Kroening
TACAS2
2016 2LS for Program Analysis - (Competition Contribution)
Peter Schrammel, Daniel Kroening
TACAS2
2016 Automatic Generation of Propagation Complete SAT Encodings
Martin Brain, Liana Hadarean, Daniel Kroening, Ruben Martins
VMCAI3
2016 Preface: Special Issue on Interpolation
Daniel Kroening, Andrey Rybalchenko
J. Autom. Reason.1
2016 Generating test case chains for reactive systems
abstract
Testing of reactive systems is challenging because long input sequences are often needed to drive them into a state to test a desired feature. This is particularly problematic in on-target testing , where a system is tested in its real-life application environment and the amount of time required for resetting is high. This article presents an approach to discovering a test case chain —a single software execution that covers a group of test goals and minimizes overall test execution time. Our technique targets the scenario in which test goals for the requirements are given as safety properties. We give conditions for the existence and minimality of a single test case chain and minimize the number of test case chains if a single test case chain is infeasible. We report experimental results with our ChainCover tool for C code generated from Simulink models and compare it to state-of-the-art test suite generators.
Peter Schrammel, Tom Melham, Daniel Kroening
Int. J. Softw. Tools Technol. Transf.3
2015 Learning the Language of Error
Martin Chapman, Hana Chockler, Pascal Kesseli, Daniel Kroening, Ofer Strichman, Michael Tautschnig
ATVA4
2015 Unfolding-based Partial Order Reduction
abstract
Partial order reduction (POR) and net unfoldings are two alternative methods to tackle state-space explosion caused by concurrency. In this paper, we propose the combination of both approaches in an effort to combine their strengths. We first define, for an abstract execution model, unfolding semantics parameterized over an arbitrary independence relation. Based on it, our main contribution is a novel stateless POR algorithm that explores at most one execution per Mazurkiewicz trace, and in general, can explore exponentially fewer, thus achieving a form of super-optimality. Furthermore, our unfolding-based POR copes with non-terminating executions and incorporates state caching. On benchmarks with busy-waits, among others, our experiments show a dramatic reduction in the number of executions when compared to a state-of-the-art DPOR.
César Rodríguez, Marcelo Sousa, Subodh Sharma 0001, Daniel Kroening
CONCUR4
2015 Effective verification of low-level software with nested interrupts
Daniel Kroening, Lihao Liang, Tom Melham, Peter Schrammel, Michael Tautschnig
DATE1
2015 Verifying synchronous reactive systems using lazy abstraction
Kumar Madhukar, Mandayam K. Srivas, Björn Wachter, Daniel Kroening, Ravindra Metta
DATE4
2015 Unrestricted Termination and Non-termination Arguments for Bit-Vector Programs
Cristina David, Daniel Kroening, Matt Lewis
ESOP2
2015 Propositional Reasoning about Safety and Termination of Heap-Manipulating Programs
Cristina David, Daniel Kroening, Matt Lewis
ESOP2
2015 Evaluation of Measures for Statistical Fault Localisation and an Optimising Scheme
David Landsberg, Hana Chockler, Daniel Kroening, Matt Lewis
FASE3
2015 Property-Driven Fence Insertion Using Reorder Bounded Model Checking
Saurabh Joshi 0001, Daniel Kroening
FM2
2015 Proving Safety with Trace Automata and Bounded Model Checking
Daniel Kroening, Matt Lewis, Georg Weissenbacher
FM1
2015 Accelerating Invariant Generation
abstract
Acceleration is a technique for summarising loops by computing a closed-form representation of the loop behaviour. The closed form can be turned into an accelerator, which is a code snippet that skips over intermediate states of the loop to the end of the loop in a single step. Program analysers rely on invariant generation techniques to reason about loops. The state-of-the-art invariant generation techniques, in practice, often struggle to find concise loop invariants, and, instead, degrade into unrolling loops, which is ineffective for non-trivial programs. In this paper, we evaluate experimentally whether loop accelerators enable existing program analysis algorithm to discover loop invariants more reliably and more efficiently. This paper is the first comprehensive study on the synergies between acceleration and invariant generation. We report our experience with a collection of safe and unsafe programs drawn from the Software Verification Competition and the literature.
Kumar Madhukar, Björn Wachter, Daniel Kroening, Matt Lewis, Mandayam K. Srivas
FMCAD3
2015 Successful Use of Incremental BMC in the Automotive Industry
Peter Schrammel, Daniel Kroening, Martin Brain, Ruben Martins, Tino Teige, Tom Bienmüller
FMICS2
2015 On Partial Order Semantics for SAT/SMT-Based Symbolic Encodings of Weak Memory Concurrency
Alex Horn, Daniel Kroening
FORTE2
2015 Faster Linearizability Checking via P-Compositionality
Alex Horn, Daniel Kroening
FORTE2
2015 Synthesising Interprocedural Bit-Precise Termination Proofs (T)
abstract
Proving program termination is key to guaranteeing absence of undesirable behaviour, such as hanging programs and even security vulnerabilities such as denial-of-service attacks. To make termination checks scale to large systems, interprocedural termination analysis seems essential, which is a largely unexplored area of research in termination analysis, where most effort has focussed on difficult single-procedure problems. We present a modular termination analysis for C programs using template-based interprocedural summarisation. Our analysis combines a context-sensitive, over-approximating forward analysis with the inference of under-approximating preconditions for termination. Bit-precise termination arguments are synthesised over lexicographic linear ranking function templates. Our experimental results show that our tool 2LS outperforms state-of-the-art alternatives, and demonstrate the clear advantage of interprocedural reasoning over monolithic analysis in terms of efficiency, while retaining comparable precision.
Hong-Yi Chen, Cristina David, Daniel Kroening, Peter Schrammel, Björn Wachter
ASE3
2015 Using Program Synthesis for Program Analysis
Cristina David, Daniel Kroening, Matt Lewis
LPAR2
2015 Safety Verification and Refutation by k-Invariants and k-Induction
Martin Brain, Saurabh Joshi 0001, Daniel Kroening, Peter Schrammel
SAS3
2015 Unbounded-Time Analysis of Guarded LTI Systems with Inputs by Abstract Acceleration
Dario Cattaruzza, Alessandro Abate, Peter Schrammel, Daniel Kroening
SAS4
2015 Under-approximating loops in C programs for fast counterexample detection
abstract
Many software model checkers only detect counterexamples with deep loops after exploring numerous spurious and increasingly longer counterexamples. We propose a technique that aims at eliminating this weakness by constructing auxiliary paths that represent the effect of a range of loop iterations. Unlike acceleration, which captures the exact effect of arbitrarily many loop iterations, these auxiliary paths may under-approximate the behaviour of the loops. In return, the approximation is sound with respect to the bit-vector semantics of programs. Our approach supports arbitrary conditions and assignments to arrays in the loop body, but may as a result introduce quantified conditionals. To reduce the resulting performance penalty, we present two quantifier elimination techniques specially geared towards our application. Loop under-approximation can be combined with a broad range of verification techniques. We paired our techniques with lazy abstraction and bounded model checking, and evaluated the resulting tool on a number of buffer overflow benchmarks, demonstrating its ability to efficiently detect deep counterexamples in C programs that manipulate arrays.
Daniel Kroening, Matt Lewis, Georg Weissenbacher
Formal Methods Syst. Des.1
2014 Don't Sit on the Fence - A Static Analysis Approach to Automatic Fence Insertion
Jade Alglave, Daniel Kroening, Vincent Nimal, Daniel Poetzl
CAV2
2014 Lost in Abstraction: Monotonicity in Multi-threaded Programs
Alexander Kaiser 0001, Daniel Kroening, Thomas Wahl
CONCUR2
2014 Model and Proof Generation for Heap-Manipulating Programs
Martin Brain, Cristina David, Daniel Kroening, Peter Schrammel
ESOP3
2014 Precise Predictive Analysis for Discovering Communication Deadlocks in MPI Programs
Vojtech Forejt, Daniel Kroening, Ganesh Narayanaswamy, Subodh Sharma 0001
FM2
2014 Accelerated test execution using GPUs
abstract
As product life-cycles become shorter and the scale and complexity of systems increase, accelerating the execution of large test suites gains importance. Existing research has primarily focussed on techniques that reduce the size of the test suite. By contrast, we propose a technique that accelerates test execution, allowing test suites to run in a fraction of the original time, by parallel execution with a Graphics Processing Unit (GPU).
Ajitha Rajan, Subodh Sharma 0001, Peter Schrammel, Daniel Kroening
ASE4
2014 Abstract satisfaction
abstract
This article introduces an abstract interpretation framework that codifies the operations in SAT and SMT solvers in terms of lattices, transformers and fixed points. We develop the idea that a formula denotes a set of models in a universe of structures. This set of models has characterizations as fixed points of deduction, abduction and quantification transformers. A wide range of satisfiability procedures can be understood as computing and refining approximations of such fixed points. These include procedures in the DPLL family, those for preprocessing and inprocessing in SAT solvers, decision procedures for equality logics, weak arithmetics, and procedures for approximate quantification. Our framework provides a unified, mathematical basis for studying and combining program analysis and satisfiability procedures. A practical benefit of our work is a new, logic-agnostic architecture for implementing solvers.
Vijay Victor D'Silva, Leopold Haller, Daniel Kroening
POPL3
2014 CBMC - C Bounded Model Checker - (Competition Contribution)
Daniel Kroening, Michael Tautschnig
TACAS1
2014 Deciding floating-point logic with abstract conflict driven clause learning
abstract
We present a bit-precise decision procedure for the theory of floating-point arithmetic. The core of our approach is a non-trivial, lattice-theoretic generalisation of the conflict-driven clause learning algorithm in modern sat solvers to lattice-based abstractions. We use floating-point intervals to reason about the ranges of variables, which allows us to directly handle arithmetic and is more efficient than encoding a formula as a bit-vector as in current floating-point solvers. Interval reasoning alone is incomplete, and we obtain completeness by developing a conflict analysis algorithm that reasons natively about intervals. We have implemented this method in the mathsat5 smt solver and evaluated it on assertion checking problems that bound the values of program variables. Our new technique is faster than a bit-vector encoding approach on 80 % of the benchmarks, and is faster by one order of magnitude or more on 60 % of the benchmarks. The generalisation of cdcl we propose is widely applicable and can be used to derive abstraction-based smt solvers for other theories.
Martin Brain, Vijay Victor D'Silva, Alberto Griggio, Leopold Haller, Daniel Kroening
Formal Methods Syst. Des.5
2014 A Widening Approach to Multithreaded Program Verification
abstract
Pthread-style multithreaded programs feature rich thread communication mechanisms, such as shared variables, signals, and broadcasts. In this article, we consider the automated verification of such programs where an unknown number of threads execute a given finite-data procedure in parallel. Such procedures are typically obtained as predicate abstractions of recursion-free source code written in C or Java. Many safety problems over finite-data replicated multithreaded programs are decidable via a reduction to the coverability problem in certain types of well-ordered infinite-state transition systems. On the other hand, in full generality, this problem is Ackermann-hard, which seems to rule out efficient algorithmic treatment. We present a novel, sound, and complete yet empirically efficient solution. Our approach is to judiciously widen the original set of coverability targets by configurations that involve fewer threads and are thus easier to decide, and whose exploration may well be sufficient: if they turn out uncoverable, so are the original targets. To soften the impact of “bad guesses”—configurations that turn out coverable—the exploration is accompanied by a parallel engine that generates coverable configurations; none of these is ever selected for widening. Its job being merely to prevent bad widening choices, such an engine need not be complete for coverability analysis, which enables a range of existing partial (e.g., nonterminating) techniques. We present extensive experiments on multithreaded C programs, including device driver code from FreeBSD, Solaris, and Linux distributions. Our approach outperforms existing coverability methods by orders of magnitude.
Alexander Kaiser 0001, Daniel Kroening, Thomas Wahl
ACM Trans. Program. Lang. Syst.2
2013 Partial Orders for Efficient Bounded Model Checking of Concurrent Software
Jade Alglave, Daniel Kroening, Michael Tautschnig
CAV2
2013 Under-Approximating Loops in C Programs for Fast Counterexample Detection
Daniel Kroening, Matt Lewis, Georg Weissenbacher
CAV1
2013 Software Verification for Weak Memory via Program Transformation
Jade Alglave, Daniel Kroening, Vincent Nimal, Michael Tautschnig
ESOP2
2013 Counterexample-Guided Precondition Inference
Mohamed Nassim Seghir, Daniel Kroening
ESOP2
2013 Formal co-validation of low-level hardware/software interfaces
Alex Horn, Michael Tautschnig, Celina G. Val, Lihao Liang, Tom Melham, Jim Grundy, Daniel Kroening
FMCAD7
2013 Verifying multi-threaded software with impact
Björn Wachter, Daniel Kroening, Joël Ouaknine
FMCAD2
2013 Abstract conflict driven learning
abstract
Modern satisfiability solvers implement an algorithm, called Conflict Driven Clause Learning, which combines search for a model with analysis of conflicts. We show that this algorithm can be generalised to solve the lattice-theoretic problem of determining if an additive transformer on a Boolean lattice is always bottom. Our generalised procedure combines overapproximations of greatest fixed points with underapproximation of least fixed points to obtain more precise results than computing fixed points in isolation. We generalise implication graphs used in satisfiability solvers to derive underapproximate transformers from overapproximate ones. Our generalisation provides a new method for static analysers that operate over non-distributive lattices to reason about properties that require disjunction.
Vijay Victor D'Silva, Leopold Haller, Daniel Kroening
POPL3
2013 Chaining Test Cases for Reactive System Testing
Peter Schrammel, Tom Melham, Daniel Kroening
ICTSS3
2013 Interpolation-Based Verification of Floating-Point Programs with Abstract CDCL
Martin Brain, Vijay Victor D'Silva, Alberto Griggio, Leopold Haller, Daniel Kroening
SAS5
2013 An Abstract Interpretation of DPLL(T)
Martin Brain, Vijay Victor D'Silva, Leopold Haller, Alberto Griggio, Daniel Kroening
VMCAI5
2013 Abstraction of Syntax
Vijay Victor D'Silva, Daniel Kroening
VMCAI2
2013 Ranking function synthesis for bit-vector relations
Byron Cook, Daniel Kroening, Philipp Rümmer, Christoph M. Wintersteiger
Formal Methods Syst. Des.2
2013 Loop summarization using state and transition invariants
Daniel Kroening, Natasha Sharygina, Stefano Tonetta, Aliaksei Tsitovich, Christoph M. Wintersteiger
Formal Methods Syst. Des.1
2013 Preface to the special issue "SI: Satisfiability Modulo Theories"
Ofer Strichman, Daniel Kroening
Formal Methods Syst. Des.2
2012 Efficient Coverability Analysis by Proof Minimization
Alexander Kaiser 0001, Daniel Kroening, Thomas Wahl
CONCUR2
2012 Deciding floating-point logic with systematic abstraction
Leopold Haller, Alberto Griggio, Martin Brain, Daniel Kroening
FMCAD4
2012 Satisfiability Solvers Are Static Analysers
Vijay Victor D'Silva, Leopold Haller, Daniel Kroening
SAS3
2012 satabs: A Bit-Precise Verifier for C Programs - (Competition Contribution)
Gérard Basler, Alastair F. Donaldson, Alexander Kaiser 0001, Daniel Kroening, Michael Tautschnig, Thomas Wahl
TACAS4
2012 Numeric Bounds Analysis with Conflict-Driven Learning
Vijay Victor D'Silva, Leopold Haller, Daniel Kroening, Michael Tautschnig
TACAS3
2012 Proving Reachability Using FShell - (Competition Contribution)
Andreas Holzer, Daniel Kroening, Christian Schallhart, Michael Tautschnig, Helmut Veith
TACAS2
2012 Wolverine: Battling Bugs with Interpolants - (Competition Contribution)
Georg Weissenbacher, Daniel Kroening, Sharad Malik
TACAS2
2012 Counterexample-guided abstraction refinement for symmetric concurrent programs
Alastair F. Donaldson, Alexander Kaiser 0001, Daniel Kroening, Michael Tautschnig, Thomas Wahl
Formal Methods Syst. Des.3
2012 Computing Mutation Coverage in Interpolation-Based Model Checking
abstract
Coverage is a means to quantify the quality of a system specification, and is frequently applied to assess progress in system validation. Coverage is a standard measure in testing, but is very difficult to compute in the context of formal verification. We present efficient algorithms for identifying those parts of the system that are covered by a given property. Our algorithm is integrated into state-of-the-art Boolean satisfiability problem-based model checking using Craig interpolation. The key insight into our algorithm is the re-use of previously computed inductive invariants and counterexamples. This re-use permits a a rapid completion of the vast majority of tests, and enables the computation of a coverage measure with 96% accuracy with only 5× the runtime of the model checker.
Hana Chockler, Daniel Kroening, Mitra Purandare
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.2
2011 Soundness of Data Flow Analyses for Weak Memory Models
Jade Alglave, Daniel Kroening, John Lugton, Vincent Nimal, Michael Tautschnig
APLAS2
2011 Making Software Verification Tools Really Work
Jade Alglave, Alastair F. Donaldson, Daniel Kroening, Michael Tautschnig
ATVA3
2011 Symmetry-Aware Predicate Abstraction for Shared-Variable Concurrent Programs
Alastair F. Donaldson, Alexander Kaiser 0001, Daniel Kroening, Thomas Wahl
CAV3
2011 Linear Completeness Thresholds for Bounded Model Checking
Daniel Kroening, Joël Ouaknine, Ofer Strichman, Thomas Wahl, James Worrell 0001
CAV1
2011 Interpolation-Based Software Verification with Wolverine
Daniel Kroening, Georg Weissenbacher
CAV1
2011 Test-case generation for embedded simulink via formal concept analysis
abstract
Mutation testing suffers from the high computational cost of automated test-vector generation, due to the large number of mutants that can be derived from programs and the cost of generating test-cases in a white-box manner. We propose a novel algorithm for mutation-based test-case generation for Simulink models that combines white-box testing with formal concept analysis. By exploiting similarity measures on mutants, we are able to effectively generate small sets of short test-cases that achieve high coverage on a collection of Simulink models from the automotive domain. Experiments show that our algorithm performs significantly better than random testing or simpler mutation-testing approaches.
Nannan He, Philipp Rümmer, Daniel Kroening
DAC3
2011 SCRATCH: a tool for automatic analysis of dma races
abstract
We present the SCRATCH tool, which uses bounded model checking and k-induction to automatically analyse software for multicore processors such as the Cell BE, in order to detect DMA races.
Alastair F. Donaldson, Daniel Kroening, Philipp Rümmer
PPoPP2
2011 Software Verification Using k-Induction
Alastair F. Donaldson, Leopold Haller, Daniel Kroening, Philipp Rümmer
SAS3
2011 Loop Summarization and Termination Analysis
Aliaksei Tsitovich, Natasha Sharygina, Christoph M. Wintersteiger, Daniel Kroening
TACAS4
2011 Beyond Quantifier-Free Interpolation in Extensions of Presburger Arithmetic
Angelo Brillout, Daniel Kroening, Philipp Rümmer, Thomas Wahl
VMCAI2
2011 Strengthening Induction-Based Race Checking with Lightweight Static Analysis
Alastair F. Donaldson, Leopold Haller, Daniel Kroening
VMCAI3
2011 Editorial
abstract
The importance of verification for software products is being increasingly appreciated in industry, although still not as much as necessary to become a standard development approach for industrial-scale high-quality software.In 2005, a global initiative was started by eminent researchers in both industry and academia, with the aim of establishing and disseminating a culture of software verification from the first principles by means of theories, tools and experiments.This special issue contains a selection of contributions originally presented at the 2008 Workshop on Tools at VSTTE 2008, the conference on Verified Software: Theories, Tools and Experiments in Toronto.The VSTTE series of conferences and workshops focuses on the challenge of verifying software systems.Within VSTTE, the scope of the Tools workshop includes implementations and enabling techniques for program verifiers, which are important ingredients for the dissemination of principles and techniques among industrial practitioners.This special issue complements a sister special issue of the Journal on Software Tools For Technology Transfer (STTT) [STT10].The FAC papers address the foundational aspects of tool-based verification, whereas the STTT selection focuses on practical aspects.The general public perceives the quality of software products as a major issue.In fact, the cost of software construction is dominated by the process of debugging it and validating that the software meets the desired requirements.Due to the prohibitive cost of manual inspection, it is widely believed that computers themselves need to be part of the solution.To this end, Tony Hoare's Grand Challenge for computing research proposes the Verifying Compiler, that is, computer-implemented algorithms that validate the correctness of a given program [Hoa03].In the Manifesto of the Grand Challenge, presented at VSTTE 2005 [MW08, Coo07], the first in the series of VSTTE conferences and workshops, Tony Hoare and Jay Misra directly recognise and appraise the importance of tools as vehicles for the transmission of knowledge to practitioners.In the second paragraph of the introduction, they write: "This paper argues that the time is ripe to embark on an international Grand Challenge project to construct a program verifier that would use logical proof to give an automatic check of the correctness of programs submitted to it.Prototypes for the program verifier will be based on a sound and complete theory of programming; they will be supported by a range of program construction and analysis tools; and the entire toolset will be evaluated and evolve by experimental application to a large and widely representative sample of useful computer programs.The project will provide the scientific basis of a solution for many of the problems of programming error that afflict all builders and users of software today."The paper also suggested that the achievement of this vision should be accelerated by a major international research initiative, modelled on a Grand Challenge, with specific measurable goals.The suggested measure was one million lines of verified code, together with its specifications, designs, assertions, and other artifacts.
Daniel Kroening, Tiziana Margaria, Jim Woodcock 0001
Formal Aspects Comput.1
2011 Automatic analysis of DMA races using model checking and k-induction
Alastair F. Donaldson, Daniel Kroening, Philipp Rümmer
Formal Methods Syst. Des.2
2011 An Interpolating Sequent Calculus for Quantifier-Free Presburger Arithmetic
Angelo Brillout, Daniel Kroening, Philipp Rümmer, Thomas Wahl
J. Autom. Reason.2
2010 Dynamic Cutoff Detection in Parameterized Concurrent Programs
Alexander Kaiser 0001, Daniel Kroening, Thomas Wahl
CAV2
2010 Termination Analysis with Compositional Transition Invariants
Daniel Kroening, Natasha Sharygina, Aliaksei Tsitovich, Christoph M. Wintersteiger
CAV1
2010 Coverage in interpolation-based model checking
abstract
Coverage is a means to quantify the quality of a system specification, and is frequently applied to assess progress in system validation. Coverage is a standard measure in testing, but is very difficult to compute in the context of formal verification. We present efficient algorithms for identifying those parts of the system that are covered by a given property. Our algorithm is integrated into state-of-the-art SAT-based Model Checking using Craig interpolation. The key insight of our algorithm is to re-use previously computed inductive invariants and counterexamples. This re-use permits a quick conclusion of the vast majority of tests, and enables the computation of a coverage measure with 96% accuracy with only 5x the runtime of the Model Checker.
Hana Chockler, Daniel Kroening, Mitra Purandare
DAC2
2010 Boom: Taking Boolean Program Model Checking One Step Further
Gérard Basler, Matthew Hague, Daniel Kroening, C.-H. Luke Ong, Thomas Wahl, Haoxian Zhao
TACAS3
2010 Ranking Function Synthesis for Bit-Vector Relations
Byron Cook, Daniel Kroening, Philipp Rümmer, Christoph M. Wintersteiger
TACAS2
2010 Automatic Analysis of Scratch-Pad Memory Code for Heterogeneous Multicore Processors
Alastair F. Donaldson, Daniel Kroening, Philipp Rümmer
TACAS2
2010 Interpolant Strength
Vijay Victor D'Silva, Daniel Kroening, Mitra Purandare, Georg Weissenbacher
VMCAI2
2010 Verification and falsification of programs with loops using predicate abstraction
abstract
Abstract Predicate abstraction is a major abstraction technique for the verification of software. Data is abstracted by means of Boolean variables, which keep track of predicates over the data. In many cases, predicate abstraction suffers from the need for at least one predicate for each iteration of a loop construct in the program. We propose to extract looping counterexamples from the abstract model, and to parametrise the simulation instance in the number of loop iterations. We present a novel technique that speeds up the detection of long counterexamples as well as the verification of programs with loops.
Daniel Kroening, Georg Weissenbacher
Formal Aspects Comput.1
2010 Context-aware counter abstraction
Gérard Basler, Michele Mazzucchi, Thomas Wahl, Daniel Kroening
Formal Methods Syst. Des.4
2010 Verified software: theories, tools and experiments
Daniel Kroening, Tiziana Margaria
Int. J. Softw. Tools Technol. Transf.1
2010 Periodic orbits and equilibria in glass models for gene regulatory networks
abstract
Glass models are frequently used to model gene regulatory networks. A distinct feature of the Glass model is that its dynamics can be formalized as paths through multi-dimensional binary hypercubes. In this paper, we report a broad range of results about Glass models that have been obtained by computing the binary codes that correspond to the hypercube paths. Specifically, we propose algorithmic methods for the synthesis of specific Glass networks based on these codes. In contrast to existing work, bi-periodic networks and networks possessing both stable equilibria and periodic trajectories are considered. The robustness of the attractor is also addressed, which gives rise to hypercube paths with nondominated nodes and double coils. These paths correspond to novel combinatorial problems, for which initial experimental results are presented. Finally, a classification of Glass networks with respect to their corresponding gene interaction graphs for three genes is presented.
Igor Zinovik, Yury Chebiryak, Daniel Kroening
IEEE Trans. Inf. Theory3
2010 Race analysis for systemc using model checking
abstract
SystemC is a system-level modeling language that offers a wide range of features to describe concurrent systems at different levels of abstraction. The SystemC standard permits simulators to implement a deterministic scheduling policy, which often hides concurrency-related design flaws. We present a novel compiler for SystemC that integrates a very precise formal race analysis by means of model checking. Our compiler produces a simulator that uses the outcome of the analysis to perform partial order reduction. The key insight to make the model checking engine scale is to apply it only to tiny fractions of the SystemC model. We show that the outcome of the analysis is not only valuable to eliminate redundant context switches at runtime, but can also be used to diagnose race conditions statically. In particular, our analysis is able to reveal races that can remain undetected during simulation and is able to formally prove the absence of races.
Nicolas Blanc, Daniel Kroening
ACM Trans. Design Autom. Electr. Syst.2
2009 Symbolic Counter Abstraction for Concurrent Software
Gérard Basler, Michele Mazzucchi, Thomas Wahl, Daniel Kroening
CAV4
2009 Fixed points for multi-cycle path detection
abstract
Accurate timing analysis is crucial for obtaining the optimal clock frequency, and for other design stages such as power analysis. Most methods for estimating propagation delay identify multi-cycle paths (MCPs), which allow timing to be relaxed, but ignore the set of reachable states, achieving scalability at the cost of a severe lack of precision. Even simple circuits contain paths affecting timing that can only be detected if the set of reachable states is considered. We examine the theoretical foundations of MCP identification and characterise the MCPs in a circuit by a fixed point equation. The optimal solution to this equation can be computed iteratively and yields the largest set of MCPs in a circuit. Further, we define conservative approximations of this set, show how different MCP identification methods in the literature compare in terms of precision, and show one method to be unsound. The practical application of these results is a new method to detect multi-cycle paths using techniques for computing invariants in a circuit. Our implementation performs well on several benchmarks, including an exponential improvement on circuits analysed in the literature.
Vijay Victor D'Silva, Daniel Kroening
DATE2
2009 Strengthening properties using abstraction refinement
abstract
Model checking is an automated formal method for verifying whether a finite-state system satisfies a user-supplied specification. The usefulness of the verification result depends on how well the specification distinguishes intended from non-intended system behavior. Vacuity is a notion that helps formalize this distinction in order to improve the user's understanding of why a property is satisfied. The goal of this paper is to expose vacuity in a property in a way that increases our knowledge of the design. Our approach, based on abstraction refinement, computes a maximal set of atomic subformula occurrences that can be strengthened without compromising satisfaction. The result is a shorter and stronger and thus, generally, more valuable property. We quantify the benefits of our technique on a substantial set of circuit benchmarks.
Mitra Purandare, Thomas Wahl, Daniel Kroening
DATE3
2009 Mixed abstractions for floating-point arithmetic
abstract
Floating-point arithmetic is essential for many embedded and safety-critical systems, such as in the avionics industry. Inaccuracies in floating-point calculations can cause subtle changes of the control flow, potentially leading to disastrous errors. In this paper, we present a simple and general, yet powerful framework for building abstractions from formulas, and instantiate this framework to a bit-accurate, sound and complete decision procedure for IEEE-compliant binary floating-point arithmetic. Our procedure benefits in practice from its ability to flexibly harness both over- and underapproximations in the abstraction process. We demonstrate the potency of the procedure for the formal analysis of floating-point software.
Angelo Brillout, Daniel Kroening, Thomas Wahl
FMCAD2
2009 Loopfrog: A Static Analyzer for ANSI-C Programs
abstract
Practical software verification is dominated by two major classes of techniques. The first is model checking, which provides total precision, but suffers from the state space explosion problem. The second is abstract interpretation, which is usually much less demanding, but often returns a high number of false positives. We present Loopfrog, a static analyzer that combines the best of both worlds: the precision of model checking and the performance of abstract interpretation. In contrast to traditional static analyzers, it also provides `leaping' counterexamples to aid in the diagnosis of errors.
Daniel Kroening, Natasha Sharygina, Stefano Tonetta, Aliaksei Tsitovich, Christoph M. Wintersteiger
ASE1
2009 Finding Lean Induced Cycles in Binary Hypercubes
Yury Chebiryak, Thomas Wahl, Daniel Kroening, Leopold Haller
SAT3
2009 A framework for Satisfiability Modulo Theories
abstract
Abstract We present a unifying framework for understanding and developing SAT-based decision procedures for Satisfiability Modulo Theories (SMT). The framework is based on a reduction of the decision problem to propositional logic by means of a deductive system. The two commonly used techniques, eager encodings (a direct reduction to propositional logic) and lazy encodings (a family of techniques based on an interplay between a SAT solver and a decision procedure) are identified as special cases. This framework offers the first generic approach for eager encodings, and a simple generalization of various lazy techniques that are found in the literature.
Daniel Kroening, Ofer Strichman
Formal Aspects Comput.1
2009 An abstraction-based decision procedure for bit-vector arithmetic
Randal E. Bryant, Daniel Kroening, Joël Ouaknine, Sanjit A. Seshia, Ofer Strichman, Bryan A. Brady
Int. J. Softw. Tools Technol. Transf.2
2008 Loop Summarization Using Abstract Transformers
Daniel Kroening, Natasha Sharygina, Stefano Tonetta, Aliaksei Tsitovich, Christoph M. Wintersteiger
ATVA1
2008 Race analysis for SystemC using model checking
abstract
SystemC is a system-level modeling language that offers a wide range of features to describe concurrent systems at different levels of abstraction. The SystemC standard permits simulators to implement a deterministic scheduling policy, which often hides concurrency-related design flaws. We present a novel compiler for SystemC that integrates a formal and scalable race analysis. This analysis combines both classic static analysis and model checking techniques. The outcome of the analysis is not only valuable to diagnose the effect of race conditions, but can also be used to improve simulation performance dramatically. Our compiler produces a simulator that uses the race analysis information at runtime to perform partial-order reduction, thereby eliminating context switches that do not affect the result of the simulation. Experimental results show simulation speedups of one order of magnitude and better.
Nicolas Blanc, Daniel Kroening
ICCAD2
2008 Embedded software verification: challenges and solutions
abstract
Embedded software are becoming more and more pervasive in our lives, and many application domains have very high reliability requirements. Ensuring high software quality while still maintaining software productivity is a challenging task. In order to address this challenge, more formal analysis and automated verification techniques are needed in addition to standard software testing.
Chao Wang 0001, Malay K. Ganai, Shuvendu K. Lahiri, Daniel Kroening
ICCAD4
2008 Scoot: A Tool for the Analysis of SystemC Models
Nicolas Blanc, Daniel Kroening, Natasha Sharygina
TACAS2
2008 Approximation Refinement for Interpolation-Based Model Checking
Vijay Victor D'Silva, Mitra Purandare, Daniel Kroening
VMCAI3
2008 A Survey of Automated Techniques for Formal Software Verification
abstract
The quality and the correctness of software are often the greatest concern in electronic systems. Formal verification tools can provide a guarantee that a design is free of specific flaws. This paper surveys algorithms that perform automatic static analysis of software to detect programming errors or prove their absence. The three techniques considered are static analysis with abstract domains, model checking, and bounded model checking. A short tutorial on these techniques is provided, highlighting their differences when applied to practical problems. This paper also surveys tools implementing these techniques and describes their merits and shortcomings.
Vijay Victor D'Silva, Daniel Kroening, Georg Weissenbacher
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.2
2008 Word-Level Predicate-Abstraction and Refinement Techniques for Verifying RTL Verilog
abstract
As a first step, most model checkers used in the hardware industry convert a high-level register-transfer-level (RTL) design into a netlist. However, algorithms that operate at the netlist level are unable to exploit the structure of the higher abstraction levels and, thus, are less scalable. The RTL of a hardware description language such as Verilog is similar to a software program with special features for hardware design such as bit-vector arithmetic and concurrency. This paper uses predicate abstraction, a software verification technique, for verifying RTL Verilog. There are two challenges when applying predicate abstraction to circuits: 1) the computation of the abstract model in presence of a large number of predicates and 2) the discovery of suitable word-level predicates for abstraction refinement. We address the first problem using a technique called predicate clustering. We address the second problem by computing the weakest preconditions of Verilog statements in order to obtain new word-level predicates during abstraction refinement. We compare the performance of our technique with localization reduction, a netlist-level abstraction technique, and report improvements on a set of benchmarks.
Himanshu Jain, Daniel Kroening, Natasha Sharygina, Edmund M. Clarke
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.2
2008 Computing Binary Combinatorial Gray Codes Via Exhaustive Search With SAT Solvers
abstract
The term binary combinatorial Gray code refers to a list of binary words such that the Hamming distance between two neighboring words is one and the list satisfies some additional properties that are of interest to a particular application, e.g., circuit testing, data compression, and computational biology. New distance-preserving and circuit codes are presented along with a complete list of equivalence classes of the coil-in-the-box codes for codeword length with respect to symmetry transformations of hypercubes. A Gray-ordered code composed of all necklaces of the length is presented, improving the known result with length .
Igor Zinovik, Daniel Kroening, Yury Chebiryak
IEEE Trans. Inf. Theory2
2007 Interactive presentation: Image computation and predicate refinement for RTL verilog using word level proofs
Daniel Kroening, Natasha Sharygina
DATE1
2007 Lifting Propositional Interpolants to the Word-Level
abstract
Craig interpolants are often used to approximate inductive invariants of transition systems. Arithmetic relationships between numeric variables require word-level interpolants, which are derived from word-level proofs of unsatisfiability. While word-level theorem provers have made significant progress in the past few years, competitive solvers for many logics are based on flattening the word-level structure to the bit-level. We propose an algorithm that lifts a resolution proof obtained from a bit-flattened formula up to the word-level, which enables the computation of word-level interpolants. Experimental results for equality logic suggest that the overhead of lifting the propositional proof is very low compared to the solving time of a state-of-the-art solver.
Daniel Kroening, Georg Weissenbacher
FMCAD1
2007 Formal verification at higher levels of abstraction
abstract
Most formal verification tools on the market convert a high-level register transfer level (RTL) design into a bit-level model. Algorithms that operate at the bit-level are unable to exploit the structure provided by the higher abstraction levels, and thus, are less scalable. This tutorial surveys recent advances in formal verification using high-level models. We present word-level verification with predicate abstraction and satisfiability modulo theories (SMT) solvers. We then describe techniques for term-level modeling and ways to combine word-level and term-level approaches for scalable verification.
Daniel Kroening, Sanjit A. Seshia
ICCAD1
2007 Verifying C++ with STL containers via predicate abstraction
abstract
This paper describes a flexible and easily extensible predicate abstraction-based approach to the verification of STLusage, and observes the advantages of verifying programsin terms of high-level data structures rather than low-level pointer manipulations. We formalize the semantics of theSTL by means of a Hoare-style axiomatization. The verification requires an operational model conservatively approximating the semantics given by the Standard. Our results show advantages (in terms of errors detected and false positives avoided) over previous attempts to analyze STL usage, due to the power of the abstraction engine and model checker
Nicolas Blanc, Alex Groce, Daniel Kroening
ASE3
2007 Model checking concurrent linux device drivers
abstract
The S lam toolkit demonstrates that predicate abstraction enables automated verification of real world Windows device drivers. Our predicate abstraction-based tool DDV erify enables the automated verification of Linux device drivers and provides an accurate model of the relevant parts of the kernel. We report on benchmarks based on Linux device drivers, confirming the results that S lam established for the Windows world. Furthermore, we take predicate abstraction one step further and introduce a technique to verify concurrent software with shared memory
Thomas Witkowski, Nicolas Blanc, Daniel Kroening, Georg Weissenbacher
ASE3
2007 A First Step Towards a Unified Proof Checker for QBF
Toni Jussila, Armin Biere, Carsten Sinz, Daniel Kroening, Christoph M. Wintersteiger
SAT4
2007 Deciding Bit-Vector Arithmetic with Abstraction
Randal E. Bryant, Daniel Kroening, Joël Ouaknine, Sanjit A. Seshia, Ofer Strichman, Bryan A. Brady
TACAS2
2007 VCEGAR: Verilog CounterExample Guided Abstraction Refinement
Himanshu Jain, Daniel Kroening, Natasha Sharygina, Edmund M. Clarke
TACAS2
2007 Verification of SpecC using predicate abstraction
Edmund M. Clarke, Himanshu Jain, Daniel Kroening
Formal Methods Syst. Des.3
2007 Verification of Boolean programs with unbounded thread creation
Byron Cook, Daniel Kroening, Natasha Sharygina
Theor. Comput. Sci.2
2006 Counterexamples with Loops for Predicate Abstraction
Daniel Kroening, Georg Weissenbacher
CAV1
2006 Over-Approximating Boolean Programs with Unbounded Thread Creation
abstract
This paper describes a symbolic algorithm for over-approximating reachability in Boolean programs with unbounded thread creation. The fix-point is detected by projecting the state of the threads to the globally visible parts, which are finite. Our algorithm models recursion by over-approximating the call stack that contains the return locations of recursive function calls, as reachability is undecidable in this case. The algorithm may obtain spurious counterexamples, which are removed iteratively by means of an abstraction refinement loop. Experiments show that the symbolic algorithm for unbounded thread creation scales to large abstract models
Byron Cook, Daniel Kroening, Natasha Sharygina
FMCAD2
2006 Approximating Predicate Images for Bit-Vector Logic
Daniel Kroening, Natasha Sharygina
TACAS1
2006 Putting it all together - Formal verification of the VAMP
Sven Beyer, Christian Jacobi 0002, Daniel Kroening, Dirk Leinenbach, Wolfgang J. Paul
Int. J. Softw. Tools Technol. Transf.3
2006 Error explanation with distance metrics
Alex Groce, Sagar Chaki, Daniel Kroening, Ofer Strichman
Int. J. Softw. Tools Technol. Transf.3
2005 Cogent: Accurate Theorem Proving for Program Verification
Byron Cook, Daniel Kroening, Natasha Sharygina
CAV2
2005 Word level predicate abstraction and refinement for verifying RTL verilog
abstract
Model checking techniques applied to large industrial circuits suffer from the state space explosion problem. A major technique to address this problem is abstraction. The most commonly used abstraction technique for hardware verification is localization reduction, which removes latches that are not relevant to the property. However, localization reduction fails to reduce the size of the model if the property actually depends on most of the latches. This paper proposes to use predicate abstraction for verifying RTL Verilog, a technique successfully used for software verification. The main challenge when using predicate abstraction is the discovery of suitable predicates. We propose to use weakest preconditions of Verilog statements in order to obtain new predicates during abstraction refinement. This technique has not been applied to circuits before. On benchmarks taken from an industrial microprocessor, we successfully verified safety properties with more than 32,000 latches in the cone of influence. We compare the performance of our technique with a modern model checker that implements localization reduction.
Himanshu Jain, Daniel Kroening, Natasha Sharygina, Edmund M. Clarke
DAC2
2005 Formal verification of SystemC by automatic hardware/software partitioning
abstract
Variants of general-purpose programming languages, like SystemC, are increasingly used to specify system designs that have both hardware and software parts. The system-level languages allow a flexible partitioning in the design of the hardware and software. Moreover, many properties depend on the combination of hardware and software and cannot be verified on either part alone. Existing tools either apply non-formal approaches or handle only the low-level parts of the language. This papers presents a new technique that handles both hardware and software parts of a system description. This is done by automatically partitioning the uniform system description into synchronous (hardware) and asynchronous (software) parts. This technique has been implemented and applied to system level descriptions of several industrial examples. The hardware/software partitioning improves the performance of the verification compared to the monolithic approach.
Daniel Kroening, Natasha Sharygina
MEMOCODE1
2005 SATABS: SAT-Based Predicate Abstraction for ANSI-C
Edmund M. Clarke, Daniel Kroening, Natasha Sharygina, Karen Yorav
TACAS2
2005 Computational challenges in bounded model checking
Edmund M. Clarke, Daniel Kroening, Joël Ouaknine, Ofer Strichman
Int. J. Softw. Tools Technol. Transf.2
2004 Understanding Counterexamples with explain
Alex Groce, Daniel Kroening, Flavio Lerda
CAV2
2004 Abstraction-Based Satisfiability Solving of Presburger Arithmetic
Daniel Kroening, Joël Ouaknine, Sanjit A. Seshia, Ofer Strichman
CAV1
2004 A SAT-based algorithm for reparameterization in symbolic simulation
abstract
Parametric representations used for symbolic simulation of circuits usually use BDDs. After a few steps of symbolic simulation, state set representation is converted from one parametric representation to another smaller representation, in a process called reparameterization. For large circuits, the reparametrization step often results in a blowup of BDDs and is expensive due to a large number of quantifications of input variables involved. Efficient SAT solvers have been applied successfully for many verification problems. This paper presents a novel SAT-based reparameterization algorithm that is largely immune to the large number of input variables that need to be quantified. We show experimental results on large industrial circuits and compare our new algorithm to both SAT-based Bounded Model Checking and BDD based symbolic simulation. We were able to achieve on average 3x improvement in time and space over BMC and able to complete many examples that BDD based approach could not even finish.
Pankaj Chauhan, Edmund M. Clarke, Daniel Kroening
DAC3
2004 Fault Tolerance Tradeoffs in Moving from Decentralized to Centralized Embedded Systems
abstract
Some safety-critical distributed embedded systems may need to use centralized components to achieve certain dependability properties. The difficulty in combining centralized and distributed architectures is achieving the potential benefits of centralization without giving up properties that motivated the use of a distributed approach in the first place. This paper examines the impact on fault tolerance of adding selected centralized components to distributed embedded systems, and possible approaches to choosing an appropriate configuration. We consider the proposed use of a star topology with centralized bus guardians in the time-triggered architecture. We model systems with different levels of centralized control in their star couplers, and compare fault tolerance properties in the presence of star-coupler faults. We demonstrate that buffering entire frames in the star coupler could lead to failures in startup and integration. We also show that constraining buffer size imposes restrictions on frame size and clock rates.
Jennifer Morris, Daniel Kroening, Philip Koopman
DSN2
2004 Checking consistency of C and Verilog using predicate abstraction and induction
abstract
It is common practice to write C models of circuits due to the greater simulation efficiency. Once the C program satisfies the requirements, the circuit is designed in a hardware description language (HDL) such as Verilog. It is therefore highly desirable to automatically perform a correspondence check between the C model and a circuit given in HDL. We present an algorithm that checks consistency between an ANSI-C program and a circuit given in Verilog using predicate abstraction. The algorithm exploits the fact that the C program and the circuit share many basic predicates. In contrast to existing tools that perform predicate abstraction, our approach is SAT-based and allows all ANSI-C and Verilog operators in the predicates. We report experimental results on an out-of-order RISC processor. We compare the performance of the new technique to bounded model checking (BMC).
Daniel Kroening, Edmund M. Clarke
ICCAD1
2004 Tutorial: Software Model Checking
Edmund M. Clarke, Daniel Kroening
ICFEM2
2004 Counterexample Guided Abstraction Refinement Via Program Execution
Daniel Kroening, Alex Groce, Edmund M. Clarke
ICFEM1
2004 Accurate Theorem Proving for Program Verification
Byron Cook, Daniel Kroening, Natasha Sharygina
ISoLA2
2004 Verification of SpecC using predicate abstraction
abstract
Languages such as SystemC or SpecC offer a new design paradigm that addresses the industry's need for a fast time-to-market. However, formal verification techniques are widely applied in the hardware design industry only for low level designs, such as a netlist or RTL. The higher abstraction levels offered by these new languages are not yet amenable to rigorous, formal verification. This paper describes how to apply predicate abstraction to SpecC system descriptions. The technique supports the concurrency constructs offered by SpecC. It models the bit-vector semantics of the language accurately, and can be used for both property checking and for checking refinement together with a traditional low-level design given in Verilog.
Himanshu Jain, Daniel Kroening, Edmund M. Clarke
MEMOCODE2
2004 A Tool for Checking ANSI-C Programs
Edmund M. Clarke, Daniel Kroening, Flavio Lerda
TACAS2
2004 Completeness and Complexity of Bounded Model Checking
Edmund M. Clarke, Daniel Kroening, Joël Ouaknine, Ofer Strichman
VMCAI2
2004 Predicate Abstraction of ANSI-C Programs Using SAT
Edmund M. Clarke, Daniel Kroening, Natasha Sharygina, Karen Yorav
Formal Methods Syst. Des.2
2003 Hardware verification using ANSI-C programs as a reference
abstract
We describe an algorithm to verify a hardware design given in Verilog using an ANSI-C program as a specification. We use SAT based Bounded Model Checking [1] in order to reduce the equivalence problem to a bit vector logic decision problem. As a case study, we describe experimental results on a hardware and a software implementation of the data encryption standard (DES) algorithm.
Edmund M. Clarke, Daniel Kroening
ASP-DAC2
2003 Behavioral consistency of C and verilog programs using bounded model checking
abstract
Abstract: "We present an algorithm that checks behavioral consistency between an ANSI-C program and a circuit given in Verilog using Bounded Model Checking. Both the circuit and the program are unwound and translated into a formula that is satisfiable if and only if the circuit and the code disagree. The formula is then checked using a SAT solver. We are able to translate C programs that make use of side effects, pointers, dynamic memory allocation, and loops with conditions that cannot be evaluated statically. We describe experimental results on various reactive circuits and programs, including a small processor given in Verilog and its Instruction Set Architecture given in ANSI-C."
Edmund M. Clarke, Daniel Kroening, Karen Yorav
DAC2
2003 Specifying and Verifying Systems with Multiple Clocks
abstract
Multiple clock domains are a challenge for hardware specification and verification. We present a method for specifying the relations between multiple clocks, and for modeling the possible behaviors. We can then verify a hardware design assuming that the clocks meet these constraints. We implement our ideas in the context of SAT based bounded model checking (BMC), using ANSI-C programs to specify the functional behavior of the design.
Edmund M. Clarke, Daniel Kroening, Karen Yorav
ICCD2
2003 Efficient Computation of Recurrence Diameters
Daniel Kroening, Ofer Strichman
VMCAI1
2001 Automated Pipeline Design
abstract
The interlock and forwarding logic is considered the tricky part of fully-featured piplined microprocessor and especially debugging these parts delays the hardware design process considerably. It is therefore desirable to automate the design of both interlock and forwarding logic. The hardware design engineer begins with a sequential implementation without any interlock and forwarding logic. A tool then adds the forwarding and interlock logic required for pipelining. This paper describes the algorithm for such a tool and the correctness is formally verified. We use a standard DLX RISC processor as an example.
Daniel Kroening, Wolfgang J. Paul
DAC1