K. Rustan M. Leino

dblp:l/KRMLeino · DBLP profile ↗
← Back
72ranked-venue papers
44as first author
5since 2021 · last 2026
0000-0003-2872-8039ORCID · verified

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

Software engineering, systems software and programming languages · 51 · 31 first-author · 3 since 2021Theory of computation · 28 · 18 first-author · 4 since 2021Databases, data management, data science and information retrieval · 5 · 4 first-authorArtificial intelligence and machine learning · 1 · 1 first-authorSystems, architecture and hardware · 1Security and privacy · 1Applied, interdisciplinary, general and emerging computing · 1 · 1 first-author
YearPublicationVenuePosition
2026 Formalization of a Realistic Verification-Condition Generator for an Intermediate Verification Language
abstract
Intermediate Verification Languages (IVLs) play the same role in verification as Intermediate Representations in compilation, a layer that separates a verifier’s language-specific front-end from its logic automation back-end. Successful IVL tools such as Boogie, Why3, and Viper generate Verification Conditions (VCs) that are sent to an SMT solver. The verifier output can be trusted only if these VCs are sound with respect to the formal semantics of the IVL. Formalizing the semantics of IVLs and verifying the soundness of corresponding VC Generators with respect to this semantics is challenging if one wants to model realistic features of IVLs such as mutually recursive definitions, lexical variable and control-flow labeled scopes, interpreted and uninterpreted functions, and unbounded loops. B3 is a new IVL. This paper presents a formalization of B3’s semantics, a VC Generator for the language, and a soundness proof that these two correspond. A key practical contribution of this work is that all three components are authored in the Dafny programming language and verifier. This makes it easy for a tool maintainer to maneuver between the semantic definitions, the proofs, and the VCG’s executable code. The key theoretical contribution of the work is a methodology to split the IVL’s semantic encodings into two layers of abstraction to cover realistic aspects of the semantics, while keeping the proofs amenable to automation. Optimized for Dafny-style automation, the first layer is used to verify the correctness of the VC Generator procedure. Optimized for expressiveness, the second layer is used to capture the semantics in a natural way.
Vladimir Gladshtein, K. Rustan M. Leino
ITP2
2025 Formally Verified Cloud-Scale Authorization
abstract
All critical systems must evolve to meet the needs of a growing and diversifying user base. But supporting that evolution is challenging at increasing scale: Maintainers must find a way to ensure that each change does only what is intended, and will not inadvertently change behavior for existing users. This paper presents how we addressed this challenge for the Amazon Web Services (AWS) authorization engine, invoked 1 billion times per second, by using formal verification. Over a period of four years, we built a new authorization engine, one that behaves functionally the same as its predecessor, using the verification-aware programming language Dafny. We can now confidently deploy enhancements and optimizations while maintaining the highest assurance of both correctness and backward compatibility. We deployed the new engine in 2024 without incident and customers immediately enjoyed a threefold performance improvement. The methodology we followed to build this new engine was not an off-the-shelf application of an existing verification tool, and this paper presents several key insights: 1) Rather than prove correct the existing engine, written in Java, we found it more effective to write a new engine in Dafny, a language built for verification from the ground up, and then compile the result to Java. 2) To ensure performance, debuggability, and to gain trust from stakeholders, we needed to generate readable, idiomatic Java code, essentially a transliteration of the source Dafny. 3) To ensure that the specification matches the system's actual behavior, we performed extensive differential and shadow testing throughout the development process, ultimately comparing against 1015production samples prior to deployment. Our approach demonstrates how formal verification can be effectively applied to evolve critical legacy software at scale.
Aleks Chakarov, Jaco Geldenhuys, Matthew Heck, Michael Hicks 0001, Sam Huang, Georges-Axel Jaloyan, Anjali Joshi, K. Rustan M. Leino, Mikael Mayer, Sean McLaughlin, Akhilesh Mritunjai, Clément Pit-Claudel, Sorawee Porncharoenwase, Florian Rabe 0001, Marianna Rapoport, Giles Reger, Cody Roux, Neha Rungta, Robin Salkeld, Matthias Schlaipfer, Daniel Schoepe, Johanna Schwartzentruber, Serdar Tasiran, Aaron Tomb, Emina Torlak, Jean-Baptiste Tristan, Lucas G. Wagner, Michael W. Whalen, Remy Willems, Tongtong Xiang, Taejoon Byun, Joshua M. Cohen, Ruijie Fang, Junyoung Jang 0001, Jakob Rath, Syeda Hira Taqdees, Dominik Wagner 0001, Yongwei Yuan
ICSE8
2024 Free Facts: An Alternative to Inefficient Axioms in Dafny
abstract
Abstract Formal software verification relies on properties of functions and built-in operators. Unless these properties are handled directly by decision procedures, an automated verifier includes them in verification conditions by supplying them as universally quantified axioms or theorems. The use of quantifiers sometimes leads to bad performance, especially if automation causes the quantifiers to be instantiated many times. This paper proposes free facts as an alternative to some axioms. A free fact is a pre-instantiated axiom that is generated alongside the formulas in a verification condition that can benefit from the facts. Replacing an axiom with free facts thus reduces the number of quantifiers in verification conditions. Free facts are statically triggered by syntactic occurrences of certain patterns in the proof terms. This is less powerful than the dynamically triggered patterns used during proof construction. However, the paper shows that free facts perform well in practice.
Tabea Bordis, K. Rustan M. Leino
FM (1)2
2024 Writing Proofs in Dafny
K. Rustan M. Leino
FMCAD1
2024 Preface of the special issue on the conference on Computer-Aided Verification 2020 and 2021
Aws Albarghouthi, K. Rustan M. Leino, Alexandra Silva 0001, Caterina Urban
Formal Methods Syst. Des.2
2017 Vale: Verifying High-Performance Cryptographic Assembly Code
Barry Bond, Chris Hawblitzel, Manos Kapritsos, K. Rustan M. Leino, Jacob R. Lorch, Bryan Parno, Ashay Rane, Srinath Setty, Laure Thompson
USENIX Security Symposium4
2016 Trigger Selection Strategies to Stabilize Program Verifiers
K. Rustan M. Leino, Clément Pit-Claudel
CAV (1)1
2016 Integrated Environment for Diagnosing Verification Errors
Maria Christakis, K. Rustan M. Leino, Peter Müller 0001, Valentin Wüstholz
TACAS2
2015 Fine-Grained Caching of Verification Results
K. Rustan M. Leino, Valentin Wüstholz
CAV (1)1
2015 Automatic verification of Dafny programs with traits
abstract
This paper describes the design of traits, abstract superclasses, in the verification-aware programming language Dafny. Although there is no inheritance among classes in Dafny, the traits make it possible to describe behavior common to several classes and to write code that abstracts over the particular classes involved. The design incorporates behavioral specifications for a trait's methods and functions, just like for classes in Dafny. The design has been implemented in the Dafny tool.
Reza Ahmadi, K. Rustan M. Leino, Jyrki Nummenmaa
FTfJP@ECOOP2
2015 An Assertional Proof of the Stability and Correctness of Natural Mergesort
abstract
We present a mechanically verified implementation of the sorting algorithm Natural Mergesort that consists of a few methods specified by their contracts of pre/post conditions. Methods are annotated with assertions that allow the automatic verification of the contract satisfaction. This program-proof is made using the state-of-the-art verifier Dafny . We verify not only the standard sortedness property, but also that the algorithm performs a stable sort. Throughout the article, we provide and explain the complete text of the program-proof.
K. Rustan M. Leino, Paqui Lucio
ACM Trans. Comput. Log.1
2014 Formalizing and Verifying a Modern Build Language
Maria Christakis, K. Rustan M. Leino, Wolfram Schulte
FM2
2014 Co-induction Simply - Automatic Co-inductive Proofs in a Program Verifier
K. Rustan M. Leino, Michal Moskal
FM1
2013 Developing verified programs with dafny
abstract
Dafny is a programming language and program verifier. The language includes specification constructs and the verifier checks that the program lives up to its specifications. These tutorial notes give some Dafny programs used as examples in the tutorial.
K. Rustan M. Leino
ICSE1
2013 Automating Theorem Proving with SMT
K. Rustan M. Leino
ITP1
2013 Abstract Read Permissions: Fractional Permissions without the Fractions
Stefan Heule, K. Rustan M. Leino, Peter Müller 0001, Alexander J. Summers
VMCAI2
2013 Tools for software verification - Introduction to the special section from the seventeenth international conference on tools and algorithms for the construction and analysis of systems
Parosh Aziz Abdulla, K. Rustan M. Leino
Int. J. Softw. Tools Technol. Transf.2
2012 Program extrapolation with jennisys
abstract
The desired behavior of a program can be described using an abstract model. Compiling such a model into executable code requires advanced compilation techniques known as synthesis. This paper presents an object-based language, called Jennisys, where programming is done by introducing an abstract model, defining a concrete data representation for the model, and then being aided by automatic synthesis to produce executable code. The paper also presents a synthesis technique for the language. The technique is built on an automatic program verifier that, via an underlying SMT solver, is capable of providing concrete models to failed verifications. The technique proceeds by obtaining sample input/output values from concrete models and then extrapolating programs from the sample points. The synthesis aims to produce code with assignments, branching structure, and possibly recursive calls. It is the first to synthesize code that creates and uses objects in dynamic data structures or aggregate objects. A prototype of the language and synthesis technique has been implemented.
K. Rustan M. Leino, Aleksandar Milicevic
OOPSLA1
2012 Automating Induction with an SMT Solver
K. Rustan M. Leino
VMCAI1
2012 Stepwise refinement of heap-manipulating code in Chalice
abstract
Abstract Stepwise refinement is a well-studied technique for developing a program from an abstract description to a concrete implementation. This paper describes a system with automated tool support for refinement, powered by a state-of-the-art verification engine that uses an SMT solver. Unlike previous refinement systems, users of the presented system interact only via declarations in the programming language. Another aspect of the system is that it accounts for dynamically allocated objects in the heap, so that data representations in an abstract program can be refined into ones that use more objects. Finally, the system uses a language with familiar imperative features, including sequential composition, loops, and recursive calls, offers a syntax with skeletons for describing program changes between refinements, and provides a mechanism for supplying witnesses when refining non-deterministic programs.
K. Rustan M. Leino, Kuat Yessenov
Formal Aspects Comput.1
2011 Fractional permissions without the fractions
abstract
Fractional permissions are a popular approach to reasoning about programs that use shared-memory concurrency. Abstractly, they provide a way of managing that either multiple readers or one writer thread can access a resource concurrently. Concretely, specification using fractional permissions typically requires the user to pick concrete mathematical values for partial permissions, making specifications overly verbose, tedious to write, and harder to adapt and re-use.
Stefan Heule, K. Rustan M. Leino, Peter Müller 0001, Alexander J. Summers
FTfJP@ECOOP2
2011 The 1st Verified Software Competition: Experience Report
Vladimir Klebanov, Peter Müller 0001, Natarajan Shankar, Gary T. Leavens, Valentin Wüstholz, Eyad Alkassar, Rob Arthan, Derek Bronish, Roderick Chapman, Ernie Cohen, Mark A. Hillebrand, Bart Jacobs 0002, K. Rustan M. Leino, Rosemary Monahan, Frank Piessens, Nadia Polikarpova, Tom Ridge, Jan Smans, Stephan Tobies, Thomas Tuerk, Mattias Ulbrich, Benjamin Weiß 0001
FM13
2011 The Boogie Verification Debugger (Tool Paper)
Claire Le Goues, K. Rustan M. Leino, Michal Moskal
SEFM2
2010 Deadlock-Free Channels and Locks
K. Rustan M. Leino, Peter Müller 0001, Jan Smans
ESOP1
2010 A Polymorphic Intermediate Verification Language: Design and Logical Encoding
K. Rustan M. Leino, Philipp Rümmer
TACAS1
2010 Verifying Concurrent Programs with Chalice
K. Rustan M. Leino
VMCAI1
2010 Doomed program points
Jochen Hoenicke, K. Rustan M. Leino, Andreas Podelski, Martin Schäf, Thomas Wies
Formal Methods Syst. Des.2
2009 A Basis for Verifying Multi-threaded Programs
K. Rustan M. Leino, Peter Müller 0001
ESOP1
2009 Proving Consistency of Pure Methods and Model Fields
K. Rustan M. Leino, Ronald Middelkoop
FASE1
2009 It's Doomed; We Can Prove It
Jochen Hoenicke, K. Rustan M. Leino, Andreas Podelski, Martin Schäf, Thomas Wies
FM2
2008 Position Statement: Ceaselessly-Analyzing Development Environments, One Direction for the Next 40 Years of Software Engineering
abstract
Software engineering is both difficult and expensive. This is as true today as it was 40 years ago. The end products of software engineering, software artifacts consisting of streams of instructions, are intended to solve some problem, live up to some requirements, implement some design. To improve software engineering, we must continue to improve the process that eventually outputs these instructions. We want the instructions correctly to address the problem, and we want the ability flexibly and precisely to change the instructions when the problem, requirements, and design change.
K. Rustan M. Leino
COMPSAC1
2008 Verification of Equivalent-Results Methods
K. Rustan M. Leino, Peter Müller 0001
ESOP1
2008 A programming model for concurrent object-oriented programs
abstract
Reasoning about multithreaded object-oriented programs is difficult, due to the nonlocal nature of object aliasing and data races. We propose a programming regime (or programming model ) that rules out data races, and enables local reasoning in the presence of object aliasing and concurrency. Our programming model builds on the multithreading and synchronization primitives as they are present in current mainstream programming languages. Java or C# programs developed according to our model can be annotated by means of stylized comments to make the use of the model explicit. We show that such annotated programs can be formally verified to comply with the programming model. If the annotated program verifies, the underlying Java or C# program is guaranteed to be free from data races, and it is sound to reason locally about program behavior. Verification is modular: a program is valid if all methods are valid, and validity of a method does not depend on program elements that are not visible to the method. We have implemented a verifier for programs developed according to our model in a custom build of the Spec# programming system, and we have validated our approach on a case study.
Bart Jacobs 0002, Frank Piessens, Jan Smans, K. Rustan M. Leino, Wolfram Schulte
ACM Trans. Program. Lang. Syst.4
2007 Designing Verification Conditions for Software
K. Rustan M. Leino
CADE1
2007 Using History Invariants to Verify Observers
K. Rustan M. Leino, Wolfram Schulte
ESOP1
2007 Practical Reasoning About Invocations and Implementations of Pure Methods
Ádám Darvas, K. Rustan M. Leino
FASE2
2007 Specifying and verifying software
abstract
Software verification presents many challenges. One of these isproviding programmers with automated tool support for verification, another is providing specification support that captures common programming idioms. In this talk, I will discuss these two challenges, drawing from experience with building program verifiersfor Spec# and C. I will also give a demo of the Spec# programming system, which includes the automatic static program verifier Boogie.
K. Rustan M. Leino
ASE1
2007 Verifying Object-Oriented Software: Lessons and Challenges
K. Rustan M. Leino
TACAS1
2007 Specification and verification challenges for sequential object-oriented programs
abstract
Abstract The state of knowledge in how to specify sequential programs in object-oriented languages such as Java and C# and the state of the art in automated verification tools for such programs have made measurable progress in the last several years. This paper describes several remaining challenges and approaches to their solution.
Gary T. Leavens, K. Rustan M. Leino, Peter Müller 0001
Formal Aspects Comput.2
2006 A Verification Methodology for Model Fields
K. Rustan M. Leino, Peter Müller 0001
ESOP1
2005 Loop Invariants on Demand
K. Rustan M. Leino, Francesco Logozzo
APLAS1
2005 Modular Verification of Static Class Invariants
K. Rustan M. Leino, Peter Müller 0001
FM1
2005 Weakest-precondition of unstructured programs
abstract
Program verification systems typically transform a program into a logical expression which is then fed to a theorem prover. The logical expression represents the weakest precondition of the program relative to its specification; when (and if!) the theorem prover is able to prove the expression, then the program is considered correct. Computing such a logical expression for an imperative, structured program is straightforward, although there are issues having to do with loops and the efficiency both of the computation and of the complexity of the formula with respect to the theorem prover. This paper presents a novel approach for computing the weakest precondition of an unstructured program that is sound even in the presence of loops. The computation is efficient and the resulting logical expression provides more leeway for the theorem prover efficiently to attack the proof.
Michael Barnett 0001, K. Rustan M. Leino
PASTE2
2005 Safe Concurrency for Aggregate Objects with Invariants
abstract
Developing safe multithreaded software systems is difficult due to the potential unwanted interference among concurrent threads. This paper presents a flexible methodology for object-oriented programs that protects object structures against inconsistency due to race conditions. It is based on a recent methodology for single-threaded programs where developers define aggregate object structures using an ownership system and declare invariants over them. The methodology is supported by a set of language elements and by both a sound modular static verification method and run-time checking support. The paper reports on preliminary experience with a prototype implementation.
Bart Jacobs 0002, Frank Piessens, K. Rustan M. Leino, Wolfram Schulte
SEFM3
2005 Invariants on Demand
abstract
The last decade has displayed a trend for automatic reasoning techniques to operate on demand. Examples of this trend are counterexample-driven predicate refinement, as used in software model checking, and lemmas on demand, as used in automatic theorem proving. In line with this trend, the author shows a technique that combines abstract interpretation and theorem proving, inferring program invariants when the theorem prover cannot proceed without them. This is joint work with Francesco Logozzo. To motivate the technique, the talk also includes a demo of the Spec# programming system, which makes use of loop-invariant inference, verification-condition generation, and automatic theorem proving to reason about object-oriented programs.
K. Rustan M. Leino
SEFM1
2005 A Two-Tier Technique for Supporting Quantifiers in a Lazily Proof-Explicating Theorem Prover
K. Rustan M. Leino, Madan Musuvathi, Xinming Ou
TACAS1
2005 Abstract Interpretation with Alien Expressions and Heap Structures
Bor-Yuh Evan Chang, K. Rustan M. Leino
VMCAI2
2005 Efficient weakest preconditions
K. Rustan M. Leino
Inf. Process. Lett.1
2005 Generating error traces from verification-condition counterexamples
K. Rustan M. Leino, Todd D. Millstein, James B. Saxe
Sci. Comput. Program.1
2005 An overview of JML tools and applications
Lilian Burdy, Yoonsik Cheon, David R. Cok, Michael D. Ernst, Joseph Kiniry, Gary T. Leavens, K. Rustan M. Leino, Erik Poll
Int. J. Softw. Tools Technol. Transf.7
2004 Object Invariants in Dynamic Contexts
K. Rustan M. Leino, Peter Müller 0001
ECOOP1
2004 Challenges in Increasing Tool Support for Programming
K. Rustan M. Leino
ICTAC1
2004 Exception Safety for C#
K. Rustan M. Leino, Wolfram Schulte
SEFM1
2004 Finding stale-value errors in concurrent programs
abstract
Abstract Concurrent programs can suffer from many types of errors, not just the well‐studied problems of deadlocks and simple race conditions on variables. This paper addresses a kind of race condition that arises from reading a variable whose value is possibly out of date. The paper introduces a simple technique for detecting such stale values, and reports on the encouraging experience with a compile‐time checker that uses the technique. Copyright © 2004 John Wiley & Sons, Ltd.
Michael Burrows, K. Rustan M. Leino
Concurr. Pract. Exp.2
2003 Declaring and checking non-null types in an object-oriented language
abstract
Distinguishing non-null references from possibly-null references at the type level can detect null-related errors in object-oriented programs at compile-time. This paper gives a proposal for retrofitting a language such as C# or Java with non-null types. It addresses the central complications that arise in constructors, where declared non-null fields may not yet have been initialized, but the partially constructed object is already accessible. The paper reports experience with an implementation for annotating and checking null-related properties in C# programs.
Manuel Fähndrich, K. Rustan M. Leino
OOPSLA2
2002 Extended Static Checking for Java
abstract
Software development and maintenance are costly endeavors. The cost can be reduced if more software defects are detected earlier in the development cycle. This paper introduces the Extended Static Checker for Java (ESC/Java), an experimental compile-time program checker that finds common programming errors. The checker is powered by verification-condition generation and automatic theorem-proving techniques. It provides programmers with a simple annotation language with which programmer design decisions can be expressed formally. ESC/Java examines the annotated software and warns of inconsistencies between the design decisions recorded in the annotations and the actual code, and also warns of potential runtime errors in the code. This paper gives an overview of the checker architecture and annotation language and describes our experience applying the checker to tens of thousands of lines of Java programs.
Cormac Flanagan, K. Rustan M. Leino, Mark Lillibridge, Greg Nelson, James B. Saxe, Raymie Stata
PLDI2
2002 Using Data Groups to Specify and Check Side Effects
abstract
Reasoning precisely about the side effects of procedure calls is important to many program analyses. This paper introduces a technique for specifying and statically checking the side effects of methods in an object-oriented language. The technique uses data groups, which abstract over variables that are not in scope, and limits program behavior by two alias-confining restrictions, pivot uniqueness and owner exclusion. The technique is shown to achieve modular soundness and is simpler than previous attempts at solving this problem.
K. Rustan M. Leino, Arnd Poetzsch-Heffter, Yunhong Zhou
PLDI1
2002 Data abstraction and information hiding
abstract
This article describes an approach for verifying programs in the presence of data abstraction and information hiding, which are key features of modern programming languages with objects and modules. This article draws on our experience building and using an automatic program checker, and focuses on the property ofmodular soundness: that is, the property that the separate verifications of the individual modules of a program suffice to ensure the correctness of the composite program. We found this desirable property surprisingly difficult to achieve. A key feature of our methodology for modular soundness is a new specification construct: theabstraction dependency, which reveals which concrete variables appear in the representation of a given abstract variable, without revealing the abstraction function itself. This article discusses in detail two varieties of abstraction dependencies: static and dynamic. The article also presents a new technical definition of modular soundness as a monotonicity property of verifiability with respect to scope and uses this technical definition to formally prove the modular soundness of a programming discipline for static dependencies.
K. Rustan M. Leino, Greg Nelson
ACM Trans. Program. Lang. Syst.1
2001 Applications of Extended Static Checking
K. Rustan M. Leino
SAS1
2001 Annotation inference for modular checkers
Cormac Flanagan, Rajeev Joshi, K. Rustan M. Leino
Inf. Process. Lett.3
2001 Real estate of names
K. Rustan M. Leino
Inf. Process. Lett.1
2000 A semantic approach to secure information flow
Rajeev Joshi, K. Rustan M. Leino
Sci. Comput. Program.2
1999 Computing Permutation Encodings
abstract
Abstract. A permutation can be encoded in several different ways. This paper discusses some relations among some encodings and how one can be computed from others. The paper shows a short proof of an existing efficient algorithm for encoding a permutation and presents two new efficient algorithms. One of the new algorithms is constructed as the inverse of an existing algorithm for decoding, making it the first efficient permutation encoding algorithm obtained in that way.
K. Rustan M. Leino
Formal Aspects Comput.1
1999 Virginity: A Contribution to the Specification of Object-Oriented Software
K. Rustan M. Leino, Raymie Stata
Inf. Process. Lett.1
1999 Joining Specification Statements
K. Rustan M. Leino, Rajit Manohar
Theor. Comput. Sci.1
1998 An Extended Static Checker for Modular-3
K. Rustan M. Leino, Greg Nelson
CC1
1998 Recursive Object Types in a Logic of Object-Oriented Programs
K. Rustan M. Leino
ESOP1
1998 A Semantic Approach to Secure Information Flow
K. Rustan M. Leino, Rajeev Joshi
MPC1
1998 Data Groups: Specifying the Modification of Extended State
abstract
This paper explores the interpretation of specifications in the context of an object-oriented programming language with subclassing and method overrides. In particular, the paper considers annotations for describing what variables a method may change and the interpretation of these annotations. The paper shows that there is a problem to be solved in the specification of methods whose overrides may modify additional state introduced in subclasses. As a solution to this problem, the paper introduces data groups, which enable modular checking and rather naturally capture a programmer's design decisions.
K. Rustan M. Leino
OOPSLA1
1995 A Method for Showing Progress
abstract
Abstract Charmed by the ease with which [vdS95] shows that its program makes progress, I state a theorem that allows for showing progress of a UNITY-like program in an easy way. I also give a proof of that theorem.
K. Rustan M. Leino
Formal Aspects Comput.1
1995 Conditional Composition
abstract
Abstract Generalizing the notion of function composition, we introduce the concept of conditional function composition and present a theory of such compositions. We use the theory to describe the semantics of a programming language with exceptions, and to relate exceptions to the IF statement.
Rajit Manohar, K. Rustan M. Leino
Formal Aspects Comput.2
1995 Constructing a Program with Exceptions
K. Rustan M. Leino
Inf. Process. Lett.1