Cormac Flanagan

dblp:f/CormacFlanagan · DBLP profile ↗
← Back
72ranked-venue papers
40as first author
1since 2021 · last 2024
0000-0002-1828-3120ORCID · corroborated

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

Software engineering, systems software and programming languages · 62 · 36 first-author · 1 since 2021Theory of computation · 7 · 5 first-authorSystems, architecture and hardware · 3 · 1 first-authorSecurity and privacy · 3Databases, data management, data science and information retrieval · 1 · 1 first-author

Expertise — from the expertise taxonomy: the topics of the expert's papers under the CCF categories. A weight counts papers with recency: 1 for a paper about the topic, 0.3 when the topic is its context, halved every five years.

Software engineering, system software, and programming languages
36 papers
Concurrent programming · 42% Program verification · 21% Programming languages and type systems · 21%
Network and information security
6 papers
Systems and software security · 87% Web and mobile security · 13%
Computer architecture, parallel and distributed computing, and storage systems
4 papers
Cloud and datacenter computing · 82% Memory systems · 16% Parallel and multicore computing · 2%
Theoretical computer science
3 papers
Automated reasoning and model checking · 51% Logic in computer science · 49%

Topics — the 30 heaviest of 89, each with the papers that count most for it

TopicWeightPapersLastEvidence papers
Systems and software security
information flow control
1.352018
Secure serverless computing using dynamic information flow control · Proc. ACM Program. Lang. 2018
Faceted Secure Multi Execution · CCS 2018
Multiple Facets for Dynamic Information Flow with Exceptions · ACM Trans. Program. Lang. Syst. 2017
Concurrent programming › concurrency bug detection › data race detection
dynamic race detection
0.942018
VerifiedFT: a verified, high-performance precise dynamic race detector · PPoPP 2018
BigFoot: static check placement for dynamic race detection · PLDI 2017
Array Shadow State Compression for Precise Dynamic Race Detection (T) · ASE 2015
Concurrent programming
concurrency bugs
0.892017
BigFoot: static check placement for dynamic race detection · PLDI 2017
Sound predictive race detection in polynomial time · POPL 2012
Adversarial memory for detecting destructive races · PLDI 2010
Concurrent programming › concurrency bug detection
data race detection
0.782017
BigFoot: static check placement for dynamic race detection · PLDI 2017
Sound predictive race detection in polynomial time · POPL 2012
Adversarial memory for detecting destructive races · PLDI 2010
Systems and software security › information flow control
dynamic information flow control
0.622018
Secure serverless computing using dynamic information flow control · Proc. ACM Program. Lang. 2018
Precise, dynamic information flow for database-backed applications · PLDI 2016
Program analysis
dynamic analysis
0.552015
Array Shadow State Compression for Precise Dynamic Race Detection (T) · ASE 2015
Adversarial memory for detecting destructive races · PLDI 2010
Velodrome: a sound and complete dynamic atomicity checker for multithreaded programs · PLDI 2008
Program verification › concurrent program verification
commutativity-based reduction
0.412020
The anchor verifier for blocking and non-blocking concurrent software · Proc. ACM Program. Lang. 2020
Program verification
concurrent program verification
0.412020
The anchor verifier for blocking and non-blocking concurrent software · Proc. ACM Program. Lang. 2020
Concurrent programming
non-blocking algorithms
0.412020
The anchor verifier for blocking and non-blocking concurrent software · Proc. ACM Program. Lang. 2020
Program analysis
static analysis
0.382010
Hybrid type checking · ACM Trans. Program. Lang. Syst. 2010
Types for safe locking: Static race detection for Java · ACM Trans. Program. Lang. Syst. 2006
Hybrid type checking · POPL 2006
Systems and software security › information flow control
secure multi-execution
0.312018
Faceted Secure Multi Execution · CCS 2018
Cloud and datacenter computing
serverless computing
0.312018
Secure serverless computing using dynamic information flow control · Proc. ACM Program. Lang. 2018
Cloud and datacenter computing › serverless computing
serverless security
0.312018
Secure serverless computing using dynamic information flow control · Proc. ACM Program. Lang. 2018
Programming languages and type systems › information flow control
noninterference
0.332016
Precise, dynamic information flow for database-backed applications · PLDI 2016
Atomizer: a dynamic atomicity checker for multithreaded programs · POPL 2004
Exploiting purity for atomicity · ISSTA 2004
Programming languages and type systems
type systems
0.342012
Cooperative types for controlling thread interference in Java · ISSTA 2012
Types for atomicity: Static checking and inference for Java · ACM Trans. Program. Lang. Syst. 2008
Types for safe locking: Static race detection for Java · ACM Trans. Program. Lang. Syst. 2006
Programming languages and type systems
language semantics
0.332016
Precise, dynamic information flow for database-backed applications · PLDI 2016
Multiple facets for dynamic information flow · POPL 2012
The Essence of Compiling with Continuations · PLDI 1993
Concurrent programming › concurrency verification
atomicity verification
0.242008
Velodrome: a sound and complete dynamic atomicity checker for multithreaded programs · PLDI 2008
Exploiting Purity for Atomicity · IEEE Trans. Software Eng. 2005
Exploiting purity for atomicity · ISSTA 2004
Logic in computer science › semantics
game semantics
0.212015
Game Semantics for Type Soundness · LICS 2015
Automated reasoning and model checking › automata-based verification
trace containment
0.212015
Game Semantics for Type Soundness · LICS 2015
Concurrent programming
atomicity
0.242008
Types for atomicity: Static checking and inference for Java · ACM Trans. Program. Lang. Syst. 2008
Exploiting Purity for Atomicity · IEEE Trans. Software Eng. 2005
Atomizer: a dynamic atomicity checker for multithreaded programs · POPL 2004
Program verification
dynamic verification
0.222010
Hybrid type checking · ACM Trans. Program. Lang. Syst. 2010
Hybrid type checking · POPL 2006
Programming languages and type systems
type checking
0.222010
Hybrid type checking · ACM Trans. Program. Lang. Syst. 2010
Hybrid type checking · POPL 2006
Program verification › predicate transformers
weakest precondition
0.222012
Detecting inconsistencies via universal reachability analysis · ISSTA 2012
Avoiding exponential explosion: generating compact verification conditions · POPL 2001
Web and mobile security › web security
cross-site scripting
0.112012
Multiple facets for dynamic information flow · POPL 2012
Web and mobile security
web security
0.112012
Multiple facets for dynamic information flow · POPL 2012
Requirements engineering and software design › inconsistency management
consistency checking
0.112012
Detecting inconsistencies via universal reachability analysis · ISSTA 2012
Program analysis › dynamic analysis
happens-before analysis
0.112012
Sound predictive race detection in polynomial time · POPL 2012
Concurrent programming › concurrency bug detection › data race detection
predictive race detection
0.112012
Sound predictive race detection in polynomial time · POPL 2012
Concurrent programming › synchronization
locking
0.112020
The anchor verifier for blocking and non-blocking concurrent software · Proc. ACM Program. Lang. 2020
Concurrent programming › concurrency bug detection
atomicity violation detection
0.122008
Velodrome: a sound and complete dynamic atomicity checker for multithreaded programs · PLDI 2008
Atomizer: a dynamic atomicity checker for multithreaded programs · POPL 2004

Methods — techniques the papers use, named apart from their topics

formal semantics · 0.8static labeling · 0.7formal framework · 0.7faceted labeling · 0.7dynamic taint analysis · 0.7dynamic analysis · 0.5commutativity reasoning · 0.5reduction proofs · 0.4faceted values · 0.4dynamic race detection · 0.4static analysis · 0.3microbenchmarking · 0.3micro-benchmarking · 0.3mechanical verification · 0.3shadow memory compression · 0.3noninterference · 0.3dynamic taint tracking · 0.2adaptive online algorithm · 0.2
YearPublicationVenuePosition
2024 Mover Logic: A Concurrent Program Logic for Reduction and Rely-Guarantee Reasoning
abstract
Rely-guarantee (RG) logic uses thread interference specifications (relies and guarantees) to reason about the correctness of multithreaded software. Unfortunately, RG logic requires each function postcondition to be "stabilized" or specialized to the behavior of other threads, making it difficult to write function specifications that are reusable at multiple call sites. This paper presents mover logic, which extends RG logic to address this problem via the notion of atomic functions. Atomic functions behave as if they execute serially without interference from concurrent threads, and so they can be assigned more general and reusable specifications that avoid the stabilization requirement of RG logic. Several practical verifiers (Calvin-R, QED, CIVL, Armada, Anchor, etc.) have demonstrated the modularity benefits of atomic function specifications. However, the complexity of these systems and their correctness proofs makes it challenging to understand and extend these systems. Mover logic formalizes the central ideas of reduction in a declarative program logic that provides a foundation for future work in this area.
Cormac Flanagan, Stephen N. Freund
ECOOP1
2020 Transparent IFC Enforcement: Possibility and (In)Efficiency Results
Maximilian Algehed, Cormac Flanagan
CSF2
2020 The anchor verifier for blocking and non-blocking concurrent software
abstract
Verifying the correctness of concurrent software with subtle synchronization is notoriously challenging. We present the Anchor verifier, which is based on a new formalism for specifying synchronization disciplines that describes both (1) what memory accesses are permitted, and (2) how each permitted access commutes with concurrent operations of other threads (to facilitate reduction proofs). Anchor supports the verification of both lock-based blocking and cas-based non-blocking algorithms. Experiments on a variety concurrent data structures and algorithms show that Anchor significantly reduces the burden of concurrent verification.
Cormac Flanagan, Stephen N. Freund
Proc. ACM Program. Lang.1
2019 Optimising Faceted Secure Multi-Execution
abstract
Language-Based Information Flow Control (IFC) provides strong security guarantees for untrusted code, but often suffers from a non-negligible rate of false alarms. Multi-execution based techniques promise to provide security guarantees without raising any false alarms. However, all known multi-execution approaches introduce extraneous performance overheads which are rarely studied. In this work, we lay down the foundations for optimisation techniques aimed at reducing these overheads to a managable level, thus helping to make multi-execution more practical. We characterise our optimisations as data-and control-oriented. Data-oriented optimisations reduce storage overheads- which also helps to remove unnecessary repeated computations. In contrast, computation-oriented optimisations rely on program annotations in order to reduce needless computation. These annotations motivate the need for a new, stronger, theoretical notion of transparency- i.e., a stronger notion for characterising the lack of false alarms. To show the efficacy of our optimisation techniques, we apply them to two case-studies: a secure (faceted) database and a chat server written in a multi-execution based IFC framework. Our case-studies clearly show that our optimisations significantly reduce the storage and computational overhead, sometimes from exponential to polynomial order. All of our formal results are accompanied by mechanised proofs in Agda.
Maximilian Algehed, Alejandro Russo, Cormac Flanagan
CSF3
2018 Faceted Secure Multi Execution
abstract
To enforce non-interference, both Secure Multi-Execution (SME) and Multiple Facets (MF) rely on the introduction of multi-executions. The attractiveness of these techniques is that they are precise: secure programs running under SME or MF do not change their behavior. Although MF was intended as an optimization for SME, it does provide a weaker security guarantee for termination leaks. This paper presents Faceted Secure Multi Execution (FSME), a novel synthesis of MF and SME that combines the stronger security guarantees of SME with the optimizations of MF. The development of FSME required a unification of the ideas underlying MF and SME into a new multi-execution framework (Multef), which can be parameterized to provide MF, SME, or our new approach FSME, thus enabling an apples-to-apples comparison and benchmarking of all three approaches. Unlike the original work on MF and SME, Multef supports arbitrary (and possibly infinite) lattices necessary for decentralized labeling models---a feature needed in order to make possible the writing of applications where each principal can impose confidentiality and integrity requirements on data. We provide some micro-benchmarks for evaluating Multef and write a file hosting service, called ProtectedBox, whose functionality can be securely extended via third-party plugins.
Thomas Schmitz 0001, Maximilian Algehed, Cormac Flanagan, Alejandro Russo
CCS3
2018 VerifiedFT: a verified, high-performance precise dynamic race detector
abstract
Dynamic data race detectors are valuable tools for testing and validating concurrent software, but to achieve good performance they are typically implemented using sophisticated concurrent algorithms. Thus, they are ironically prone to the exact same kind of concurrency bugs they are designed to detect. To address these problems, we have developed VerifiedFT, a clean slate redesign of the FastTrack race detector [19]. The VerifiedFT analysis provides the same precision guarantee as FastTrack, but is simpler to implement correctly and efficiently, enabling us to mechanically verify an implementation of its core algorithm using CIVL [27]. Moreover, VerifiedFT provides these correctness guarantees without sacrificing any performance over current state-of-the-art (but complex and unverified) FastTrack implementations for Java.
James R. Wilcox, Cormac Flanagan, Stephen N. Freund
PPoPP2
2018 Secure serverless computing using dynamic information flow control
abstract
The rise of serverless computing provides an opportunity to rethink cloud security. We present an approach for securing serverless systems using a novel form of dynamic information flow control (IFC). We show that in serverless applications, the termination channel found in most existing IFC systems can be arbitrarily amplified via multiple concurrent requests, necessitating a stronger termination-sensitive non-interference guarantee, which we achieve using a combination of static labeling of serverless processes and dynamic faceted labeling of persistent data. We describe our implementation of this approach on top of JavaScript for AWS Lambda and OpenWhisk serverless platforms, and present three realistic case studies showing that it can enforce important IFC security properties with modest overhead.
Kalev Alpernas, Cormac Flanagan, Sadjad Fouladi, Leonid Ryzhyk, Shmuel Sagiv, Thomas Schmitz 0001, Keith Winstein
Proc. ACM Program. Lang.2
2017 Correctness of Partial Escape Analysis for Multithreading Optimization
abstract
Compilers often use escape analysis to elide locking operations on thread-local data. Similarly, dynamic race detectors may use escape analysis to elide race checks on thread-local data. In this paper, we study the correctness of these two related optimizations when using a partial escape analysis, which identifies objects that are currently thread-local but that may later become thread-shared.
Dustin Rhodes, Cormac Flanagan, Stephen N. Freund
FTfJP@ECOOP2
2017 BigFoot: static check placement for dynamic race detection
abstract
Precise dynamic data race detectors provide strong correctness guarantees but have high overheads because they generally keep analysis state in a separate shadow location for each heap memory location, and they check (and potentially update) the corresponding shadow location on each heap access. The BigFoot dynamic data race detector uses a combination of static and dynamic analysis techniques to coalesce checks and compress shadow locations. With BigFoot, multiple accesses to an object or array often induce a single coalesced check that manipulates a single compressed shadow location, resulting in a performance improvement over FastTrack of 61%.
Dustin Rhodes, Cormac Flanagan, Stephen N. Freund
PLDI2
2017 Multiple Facets for Dynamic Information Flow with Exceptions
abstract
JavaScript is the source of many security problems, including cross-site scripting attacks and malicious advertising code. Central to these problems is the fact that code from untrusted sources runs with full privileges. Information flow controls help prevent violations of data confidentiality and integrity. This article explores faceted values , a mechanism for providing information flow security in a dynamic manner that avoids the stuck executions of some prior approaches, such as the no-sensitive-upgrade technique. Faceted values simultaneously simulate multiple executions for different security levels to guarantee termination-insensitive noninterference. We also explore the interaction of faceted values with exceptions, declassification, and clearance.
Thomas H. Austin, Thomas Schmitz 0001, Cormac Flanagan
ACM Trans. Program. Lang. Syst.3
2016 Macrofication: Refactoring by Reverse Macro Expansion
Christopher Schuster, Tim Disney, Cormac Flanagan
ESOP3
2016 Precise, dynamic information flow for database-backed applications
abstract
We present an approach for dynamic information flow control across the application and database. Our approach reduces the amount of policy code required, yields formal guarantees across the application and database, works with existing relational database implementations, and scales for realistic applications. In this paper, we present a programming model that factors out information flow policies from application code and database queries, a dynamic semantics for the underlying $^JDB$ core language, and proofs of termination-insensitive non-interference and policy compliance for the semantics. We implement these ideas in Jacqueline, a Python web framework, and demonstrate feasibility through three application case studies: a course manager, a health record system, and a conference management system used to run an academic workshop. We show that in comparison to traditional applications with hand-coded policy checks, Jacqueline applications have 1) a smaller trusted computing base, 2) fewer lines of policy code, and 2) reasonable, often negligible, additional overheads.
Jean Yang 0001, Travis Hance, Thomas H. Austin, Armando Solar-Lezama, Cormac Flanagan, Stephen Chong
PLDI5
2015 Array Shadow State Compression for Precise Dynamic Race Detection (T)
abstract
Precise dynamic race detectors incur significant time and space overheads, particularly for array-intensive programs, due to the need to store and manipulate analysis (or shadow) state for every element of every array. This paper presents SlimState, a precise dynamic race detector that uses an adaptive, online algorithm to optimize array shadow state representations. SlimState is based on the insight that common array access patterns lead to analogous patterns in array shadow state, enabling optimized, space efficient representations of array shadow state with no loss in precision. We have implemented SlimState for Java. Experiments on a variety of benchmarks show that array shadow compression reduces the space and time overhead of race detection by 27% and 9%, respectively. It is particularly effective for array-intensive programs, reducing space and time overheads by 35% and 17%, respectively, on these programs.
James R. Wilcox, Parker Finch, Cormac Flanagan, Stephen N. Freund
ASE3
2015 Game Semantics for Type Soundness
abstract
The key idea of game semantics is that a term can interact with its enclosing context via various events, such as function calls and returns. A trace is a sequence of such interaction events. The meaning of the term is then naturally represented by the set of all event traces that the term can generate. Game semantics allows us to define the meaning of both expressions and types in the same domain which enables an interesting alternative to subject reduction for proving type soundness. This paper uses game semantics to define the meaning of and verify type soundness for a sequence of programming languages, starting with a functional sequential language (the call-by-value simply-typed lambda calculus), and then extending that proof with sub typing, side effects, control effects, and concurrency. These proofs are reasonably short and fairly semantic in structure, focusing on the relationship between the meanings of each term and its corresponding type. In particular, we show that the typing and sub typing relations are both conservative approximations of alternating trace containment.
Tim Disney, Cormac Flanagan
LICS2
2015 Cooperative types for controlling thread interference in Java
Jaeheon Yi, Tim Disney, Stephen N. Freund, Cormac Flanagan
Sci. Comput. Program.4
2014 Sweeten your JavaScript: hygienic macros for ES5
abstract
Lisp and Scheme have demonstrated the power of macros to enable programmers to evolve and craft languages. In languages with more complex syntax, macros have had less success. In part, this has been due to the difficulty in building expressive hygienic macro systems for such languages. JavaScript in particular presents unique challenges for macro systems due to ambiguities in the lexing stage that force the JavaScript lexer and parser to be intertwined.
Tim Disney, Nathan Faubion, David Herman, Cormac Flanagan
DLS4
2014 Dynamic detection of object capability violations through model checking
abstract
In this paper we present a new tool called DOCaT (Dynamic Object Capability Tracer), a model checker for JavaScript that detects capability leaks in an object capability system. DOCaT includes an editor that highlights the sections of code that can be potentially transferred to untrusted third-party code along with a trace showing how the code could be leaked in an actual execution. This code highlighting provides a simple way of visualizing the references untrusted code potentially has access to and helps programmers to discover if their code is leaking more capabilities then required. DOCaT is implemented using a combination of source code rewriting (using Sweet.js, a JavaScript macro system), dynamic behavioral intercession (Proxies, introduced in ES6, the most recent version of JavaScript), and model checking. Together these methods are able to locate common ways for untrusted code to elevate its authority.
Dustin Rhodes, Tim Disney, Cormac Flanagan
DLS3
2014 Developments in automated verification techniques
Cormac Flanagan, Barbara König 0001
Int. J. Softw. Tools Technol. Transf.1
2013 RedCard: Redundant Check Elimination for Dynamic Race Detectors
Cormac Flanagan, Stephen N. Freund
ECOOP1
2012 A Functional View of Imperative Information Flow
Thomas H. Austin, Cormac Flanagan, Martín Abadi
APLAS2
2012 Detecting inconsistencies via universal reachability analysis
abstract
Recent research has suggested that a large class of software bugs fall into the category of inconsistencies, or cases where two pieces of program code make incompatible assumptions. Existing approaches to inconsistency detection have used intentionally unsound techniques aimed at bug-finding rather than verification. We describe an inconsistency detection analysis that extends previous work and is based on the foundation of the weakest precondition calculus. On a closed program, this analysis can serve as a full verification technique, while in cases where some code is unknown, a theorem prover is incomplete, or specifications are incomplete, it can serve as bug finding technique with a low false-positive rate.
Aaron Tomb, Cormac Flanagan
ISSTA2
2012 Cooperative types for controlling thread interference in Java
abstract
Multithreaded programs are notoriously prone to unintended interference between concurrent threads. To address this problem, we argue that yield annotations in the source code should document all thread interference, and we present a type system for verifying the absence of undocumented interference in Java programs. Under this type system, well-typed programs behave as if context switches occur only at yield annotations. Thus, well-typed programs can be understood using intuitive sequential reasoning, except where yield annotations remind the programmer to account for thread interference.
Jaeheon Yi, Tim Disney, Stephen N. Freund, Cormac Flanagan
ISSTA4
2012 Multiple facets for dynamic information flow
abstract
JavaScript has become a central technology of the web, but it is also the source of many security problems, including cross-site scripting attacks and malicious advertising code. Central to these problems is the fact that code from untrusted sources runs with full privileges. We implement information flow controls in Firefox to help prevent violations of data confidentiality and integrity. Most previous information flow techniques have primarily relied on either static type systems, which are a poor fit for JavaScript, or on dynamic analyses that sometimes get stuck due to problematic implicit flows, even in situations where the target web application correctly satisfies the desired security policy. We introduce faceted values, a new mechanism for providing information flow security in a dynamic manner that overcomes these limitations. Taking inspiration from secure multi-execution, we use faceted values to simultaneously and efficiently simulate multiple executions for different security levels, thus providing non-interference with minimal overhead, and without the reliance on the stuck executions of prior dynamic approaches.
Thomas H. Austin, Cormac Flanagan
POPL2
2012 Sound predictive race detection in polynomial time
abstract
Data races are among the most reliable indicators of programming errors in concurrent software. For at least two decades, Lamport's happens-before (HB) relation has served as the standard test for detecting races--other techniques, such as lockset-based approaches, fail to be sound, as they may falsely warn of races. This work introduces a new relation, causally-precedes (CP), which generalizes happens-before to observe more races without sacrificing soundness. Intuitively, CP tries to capture the concept of happens-before ordered events that must occur in the observed order for the program to observe the same values. What distinguishes CP from past predictive race detection approaches (which also generalize an observed execution to detect races in other plausible executions) is that CP-based race detection is both sound and of polynomial complexity. We demonstrate that the unique aspects of CP result in practical benefit. Applying CP to real-world programs, we successfully analyze server-level applications (e.g., Apache FtpServer) and show that traces longer than in past predictive race analyses can be analyzed in mere seconds to a few minutes. For these programs, CP race detection uncovers races that are hard to detect by repeated execution and HB race detection: a single run of CP race detection produces several races not discovered by 10 separate rounds of happens-before race detection.
Yannis Smaragdakis, Jacob Evans, Caitlin Sadowski, Jaeheon Yi, Cormac Flanagan
POPL5
2011 Temporal higher-order contracts
abstract
Behavioral contracts are embraced by software engineers because they document module interfaces, detect interface violations, and help identify faulty modules (packages, classes, functions, etc). This paper extends prior higher-order contract systems to also express and enforce temporal properties, which are common in software systems with imperative state, but which are mostly left implicit or are at best informally specified. The paper presents both a programmatic contract API as well as a temporal contract language, and reports on experience and performance results from implementing these contracts in Racket.
Tim Disney, Cormac Flanagan, Jay McCarthy
ICFP2
2011 Virtual values for language extension
abstract
This paper focuses on extensibility, the ability of a programmer using a particular language to extend the expressiveness of that language. This paper explores how to provide an interesting notion of extensibility by virtualizing the interface between code and data. A virtual value is a special value that supports behavioral intercession. When a primitive operation is applied to a virtual value, it invokes a trap on that virtual value. A virtual value contains multiple traps, each of which is a user-defined function that describes how that operation should behave on that value. This paper formalizes the semantics of virtual values, and shows how they enable the definition of a variety of language extensions, including additional numeric types; delayed evaluation; taint tracking; contracts; revokable membranes; and units of measure. We report on our experience implementing virtual values for Javascript within an extension for the Firefox browser.
Thomas H. Austin, Tim Disney, Cormac Flanagan
OOPSLA3
2011 Correct blame for contracts: no more scapegoating
abstract
Behavioral software contracts supplement interface information with logical assertions. A rigorous enforcement of contracts provides useful feedback to developers if it signals contract violations as soon as they occur and if it assigns blame to violators with preciseexplanations. Correct blame assignment gets programmers started with the debugging process and can significantly decrease the time needed to discover and fix bugs.
Christos Dimoulas, Robert Bruce Findler, Cormac Flanagan, Matthias Felleisen
POPL3
2011 Cooperative reasoning for preemptive execution
abstract
We propose a cooperative methodology for multithreaded software, where threads use traditional synchronization idioms such as locks, but additionally document each point of potential thread interference with a "yield" annotation. Under this methodology, code between two successive yield annotations forms a serializable transaction that is amenable to sequential reasoning. This methodology reduces the burden of reasoning about thread interleavings by indicating only those interference points that matter. We present experimental results showing that very few yield annotations are required, typically one or two per thousand lines of code. We also present dynamic analysis algorithms for detecting cooperability violations, where thread interference is not documented by a yield, and for yield annotation inference for legacy software.
Jaeheon Yi, Caitlin Sadowski, Cormac Flanagan
PPoPP3
2011 Cooperative Concurrency for a Multicore World - (Extended Abstract)
Jaeheon Yi, Caitlin Sadowski, Stephen N. Freund, Cormac Flanagan
RV4
2010 The RoadRunner dynamic analysis framework for concurrent programs
abstract
RoadRunner is a dynamic analysis framework designed to facilitate rapid prototyping and experimentation with dynamic analyses for concurrent Java programs. It provides a clean API for communicating an event stream to back-end analyses, where each event describes some operation of interest performed by the target program, such as accessing memory, synchronizing on a lock, forking a new thread, and so on. This API enables the developer to focus on the essential algorithmic issues of the dynamic analysis, rather than on orthogonal infrastructure complexities.
Cormac Flanagan, Stephen N. Freund
PASTE1
2010 Adversarial memory for detecting destructive races
abstract
Multithreaded programs are notoriously prone to race conditions, a problem exacerbated by the widespread adoption of multi-core processors with complex memory models and cache coherence protocols. Much prior work has focused on static and dynamic analyses for race detection, but these algorithms typically are unable to distinguish destructive races that cause erroneous behavior from benign races that do not. Performing this classification manually is difficult, time consuming, and error prone.
Cormac Flanagan, Stephen N. Freund
PLDI1
2010 Hybrid type checking
abstract
Traditional static type systems are effective for verifying basic interface specifications. Dynamically checked contracts support more precise specifications, but these are not checked until runtime, resulting in incomplete detection of defects. Hybrid type checking is a synthesis of these two approaches that enforces precise interface specifications, via static analysis where possible, but also via dynamic checks where necessary. This article explores the key ideas and implications of hybrid type checking, in the context of the λ-calculus extended withcontract types, that is, with dependent function types and with arbitrary refinements of base types.
Kenneth L. Knowles, Cormac Flanagan
ACM Trans. Program. Lang. Syst.2
2009 SingleTrack: A Dynamic Determinism Checker for Multithreaded Programs
Caitlin Sadowski, Stephen N. Freund, Cormac Flanagan
ESOP3
2009 FastTrack: efficient and precise dynamic race detection
abstract
\begin{abstract}
Cormac Flanagan, Stephen N. Freund
PLDI1
2008 Velodrome: a sound and complete dynamic atomicity checker for multithreaded programs
abstract
Atomicity is a fundamental correctness property in multithreaded programs, both because atomic code blocks are amenable to sequential reasoning (which significantly simplifies correctness arguments), and because atomicity violations often reveal defects in a program's synchronization structure. Unfortunately, all atomicity analyses developed to date are incomplete in that they may yield false alarms on correctly synchronized programs, which limits their usefulness.
Cormac Flanagan, Stephen N. Freund, Jaeheon Yi
PLDI1
2008 Atomizer: A dynamic atomicity checker for multithreaded programs
Cormac Flanagan, Stephen N. Freund
Sci. Comput. Program.1
2008 Types for atomicity: Static checking and inference for Java
abstract
Atomicity is a fundamental correctness property in multithreaded programs. A method is atomic if, for every execution, there is an equivalent serial execution in which the actions of the method are not interleaved with actions of other threads. Atomic methods are amenable to sequential reasoning, which significantly facilitates subsequent analysis and verification. This article presents a type system for specifying and verifying the atomicity of methods in multithreaded Java programs using a synthesis of Lipton's theory of reduction and type systems for race detection. The type system supports guarded, write-guarded, and unguarded fields, as well as thread-local data, parameterized classes and methods, and protected locks. We also present an algorithm for verifying atomicity via type inference. We have applied our type checker and type inference tools to a number of commonly used Java library classes and programs. These tools were able to verify the vast majority of methods in these benchmarks as atomic, indicating that atomicity is a widespread methodology for multithreaded programming. In addition, reported atomicity violations revealed some subtle errors in the synchronization disciplines of these programs.
Cormac Flanagan, Stephen N. Freund, Marina Lifshin, Shaz Qadeer
ACM Trans. Program. Lang. Syst.1
2007 Type Reconstruction for General Refinement Types
Kenneth L. Knowles, Cormac Flanagan
ESOP2
2007 Type inference against races
Cormac Flanagan, Stephen N. Freund
Sci. Comput. Program.1
2006 Hybrid type checking
abstract
Traditional static type systems are very effective for verifying basic interface specifications, but are somewhat limited in the kinds specifications they support. Dynamically-checked contracts can enforce more precise specifications, but these are not checked until run time, resulting in incomplete detection of defects. Hybrid type checking is a synthesis of these two approaches that enforces precise interface specifications, via static analysis where possible, but also via dynamic checks where necessary. This paper explores the key ideas and implications of hybrid type checking, in the context of the simply-typed A-calculus with arbitrary refinements of base types.
Cormac Flanagan
POPL1
2006 Types for safe locking: Static race detection for Java
abstract
This article presents a static race-detection analysis for multithreaded shared-memory programs, focusing on the Java programming language. The analysis is based on a type system that captures many common synchronization patterns. It supports classes with internal synchronization, classes that require client-side synchronization, and thread-local classes. In order to demonstrate the effectiveness of the type system, we have implemented it in a checker and applied it to over 40,000 lines of hand-annotated Java code. We found a number of race conditions in the standard Java libraries and other test programs. The checker required fewer than 20 additional type annotations per 1,000 lines of code. This article also describes two improvements that facilitate checking much larger programs: an algorithm for annotation inference and a user interface that clarifies warnings generated by the checker. These extensions have enabled us to use the checker for identifying race conditions in large-scale software systems with up to 500,000 lines of code.
Martín Abadi, Cormac Flanagan, Stephen N. Freund
ACM Trans. Program. Lang. Syst.2
2005 Extending JML for Modular Specification and Verification of Multi-threaded Programs
Edwin Rodríguez, Matthew B. Dwyer, Cormac Flanagan, John Hatcliff, Gary T. Leavens, Robby
ECOOP3
2005 Dynamic partial-order reduction for model checking software
abstract
We present a new approach to partial-order reduction for model checking software. This approach is based on initially exploring an arbitrary interleaving of the various concurrent processes/threads, and dynamically tracking interactions between these to identify backtracking points where alternative paths in the state space need to be explored. We present examples of multi-threaded programs where our new dynamic partial-order reduction technique significantly reduces the search space, even though traditional partial-order algorithms are helpless.
Cormac Flanagan, Patrice Godefroid
POPL1
2005 Automatic type inference via partial evaluation
abstract
Type checking and type inference are fundamentally similar problems. However, the algorithms for performing the two operations, on the same type system, often differ significantly. The type checker is typically a straightforward encoding of the original type rules. For many systems, type inference is performed using a two-phase, constraint-based algorithm.We present an approach that, given the original type rules written as clauses in a logic programming language, automatically generates an efficient, two-phase, constraint-based type inference algorithm. Our approach works by partially evaluating the type checking rules with respect to the target program to yield a set of constraints suitable for input to an external constraint solver. This approach avoids the need to manually develop and verify a separate type inference algorithm, and is ideal for experimentation with and rapid prototyping of novel type systems.
Aaron Tomb, Cormac Flanagan
PPDP2
2005 Modular verification of multithreaded programs
Cormac Flanagan, Stephen N. Freund, Shaz Qadeer, Sanjit A. Seshia
Theor. Comput. Sci.1
2005 Exploiting Purity for Atomicity
abstract
Multithreaded programs often exhibit erroneous behavior because of unintended interactions between concurrent threads. This paper focuses on the noninterference property of atomicity. A procedure is atomic if, for every execution, there is an equivalent serial execution in which the actions of the atomic procedure are not interleaved with actions of other threads. This key property makes atomic procedures amenable to sequential reasoning techniques, which significantly facilitates subsequent validation activities such as code inspection and testing. Several existing tools verify atomicity by using commutativity of actions to show that every execution reduces to a corresponding serial execution. However, experiments with these tools have highlighted a number of interesting procedures that, while intuitively atomic, are not reducible. In this paper, we exploit the notion of pure code blocks to verify the atomicity of such irreducible procedures. If a pure block terminates normally, then its evaluation does not change the program state and, hence, these evaluation steps can be removed from the program trace before reduction. We develop a static typed-based analysis for atomicity based on this insight, and we illustrate this analysis on a number of interesting examples that could not be verified using earlier tools based purely on reduction.
Cormac Flanagan, Stephen N. Freund, Shaz Qadeer
IEEE Trans. Software Eng.1
2004 Atomizer: A Dynamic Atomicity Checker for Multithreaded Programs (Summary)
abstract
Summary form only given. Ensuring the correctness of multithreaded programs is difficult, due to the potential for unexpected interactions between concurrent threads. We focus on the fundamental noninterference property of atomicity and present a dynamic analysis for detecting atomicity violations. This analysis combines ideas from both Lipton 's theory of reduction and earlier dynamic race detectors such as Eraser. Experimental results demonstrate that this dynamic atomicity analysis is effective for detecting errors due to unintended interactions between threads. In addition, the majority of methods in our benchmarks are atomic, supporting our hypothesis that atomicity is a standard methodology in multithreaded programming.
Cormac Flanagan, Stephen N. Freund
IPDPS1
2004 Exploiting purity for atomicity
abstract
Abstract—Multithreaded programs often exhibit erroneous behavior because of unintended interactions between concurrent threads. This paper focuses on the noninterference property of atomicity. A procedure is atomic if, for every execution, there is an equivalent serial execution in which the actions of the atomic procedure are not interleaved with actions of other threads. This key property makes atomic procedures amenable to sequential reasoning techniques, which significantly facilitates subsequent validation activities such as code inspection and testing. Several existing tools verify atomicity by using commutativity of actions to show that every execution reduces to a corresponding serial execution. However, experiments with these tools have highlighted a number of interesting procedures that, while intuitively atomic, are not reducible. In this paper, we exploit the notion of pure code blocks to verify the atomicity of such irreducible procedures. If a pure block terminates normally, then its evaluation does not change the program state and, hence, these evaluation steps can be removed from the program trace before reduction. We develop a static typed-based analysis for atomicity based on this insight, and we illustrate this analysis on a number of interesting examples that could not be verified using earlier tools based purely on reduction. Index Terms—Atomicity, purity, reduction, concurrent programs. 1
Cormac Flanagan, Stephen N. Freund, Shaz Qadeer
ISSTA1
2004 Atomizer: a dynamic atomicity checker for multithreaded programs
abstract
Ensuring the correctness of multithreaded programs is difficult, due to the potential for unexpected interactions between concurrent threads. Much previous work has focused on detecting race conditions, but the absence of race conditions does not by itself prevent undesired thread interactions. We focus on the more fundamental non-interference property of atomicity; a method is atomic if its execution is not affected by and does not interfere with concurrently-executing threads. Atomic methods can be understood according to their sequential semantics, which significantly simplifies (formal and informal) correctness arguments.This paper presents a dynamic analysis for detecting atomicity violations. This analysis combines ideas from both Lipton's theory of reduction and earlier dynamic race detectors. Experience with a prototype checker for multithreaded Java code demonstrates that this approach is effective for detecting errors due to unintended interactions between threads. In particular, our atomicity checker detects errors that would be missed by standard race detectors, and it produces fewer false alarms on benign races that do not cause atomicity violations. Our experimental results also indicate that the majority of methods in our benchmarks are atomic, supporting our hypothesis that atomicity is a standard methodology in multithreaded programming.
Cormac Flanagan, Stephen N. Freund
POPL1
2004 Type Inference Against Races
Cormac Flanagan, Stephen N. Freund
SAS1
2004 Automatic software model checking via constraint logic
Cormac Flanagan
Sci. Comput. Program.1
2003 Theorem Proving Using Lazy Proof Explication
Cormac Flanagan, Rajeev Joshi, Xinming Ou, James B. Saxe
CAV1
2003 Automatic Software Model Checking Using CLP
Cormac Flanagan
ESOP1
2003 A type and effect system for atomicity
abstract
Ensuring the correctness of multithreaded programs is difficult, due to the potential for unexpected and nondeterministic interactions between threads. Previous work addressed this problem by devising tools for detecting race conditions, a situation where two threads simultaneously access the same data variable, and at least one of the accesses is a write. However, verifying the absence of such simultaneous-access race conditions is neither necessary nor sufficient to ensure the absence of errors due to unexpected thread interactions.We propose that a stronger non-interference property is required, namely atomicity. Atomic methods can be assumed to execute serially, without interleaved steps of other threads. Thus, atomic methods are amenable to sequential reasoning techniques, which significantly simplifies both formal and informal reasoning about program correctness.This paper presents a type system for specifying and verifying the atomicity of methods in multithreaded Java programs. The atomic type system is a synthesis of Lipton's theory of reduction and type systems for race detection.We have implemented this atomic type system for Java and used it to check a variety of standard Java library classes. The type checker uncovered subtle atomicity violations in classes such as java.lang.String and java.lang.String-Buffer that cause crashes under certain thread interleavings.This paper proposes that a stronger non-interference property is required, namely atomicity, and presents a type system for verifying the atomicity of methods in multithreaded Java programs. Methods in a class can be annotated with the keyword atomic. Clients of a well-typed class can then assume that each atomic method is executed in one step, thus significantly simplifying both formal and informal reasoning about the client's correctness.
Cormac Flanagan, Shaz Qadeer
PLDI1
2002 A Modular Checker for Multithreaded Programs
Cormac Flanagan, Shaz Qadeer, Sanjit A. Seshia
CAV1
2002 Thread-Modular Verification for Shared-Memory Programs
Cormac Flanagan, Stephen N. Freund, Shaz Qadeer
ESOP1
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
PLDI1
2002 Predicate abstraction for software verification
abstract
Software verification is an important and difficult problem. Many static checking techniques for software require annotations from the programmer in the form of method specifications and loop invariants. This annotation overhead, particularly of loop invariants, is a significant hurdle in the acceptance of static checking. We reduce the annotation burden by inferring loop invariants automatically.Our method is based on predicate abstraction, an abstract interpretation technique in which the abstract domain is constructed from a given set of predicates over program variables. A novel feature of our approach is that it infers universally-quantified loop invariants, which are crucial for verifying programs that manipulate unbounded data such as arrays. We present heuristics for generating appropriate predicates for each loop automatically; the programmer can specify additional predicates as well. We also present an efficient algorithm for computing the abstraction of a set of states in terms of a collection of predicates.Experiments on a 44KLOC program show that our approach can automatically infer the necessary predicates and invariants for all but 31 of the 396 routines that contain loops.
Cormac Flanagan, Shaz Qadeer
POPL1
2002 DrScheme: a programming environment for Scheme
abstract
DrScheme is a programming environment for Scheme. It fully integrates a graphics-enriched editor, a parser for multiple variants of Scheme, a functional read-eval-print loop, and an algebraic printer. The environment is especially useful for students, because it has a tower of syntactically restricted variants of Scheme that are designed to catch typical student mistakes and explain them in terms the students understand. The environment is also useful for professional programmers, due to its sophisticated programming tools, such as the static debugger, and its advanced language features, such as units and mixins. Beyond the ordinary programming environment tools, DrScheme provides an algebraic stepper, a context-sensitive syntax checker, and a static debugger. The stepper reduces Scheme programs to values, according to the reduction semantics of Scheme. It is useful for explaining the semantics of linguistic facilities and for studying the behavior of small programs. The syntax checker annotates programs with font and color changes based on the syntactic structure of the program. On demand, it draws arrows that point from bound to binding occurrences of identifiers. It also supports α-renaming. Finally, the static debugger provides a type inference system that explains specific inferences in terms of a value-flow graph, selectively overlaid on the program text.
Robert Bruce Findler, John Clements, Cormac Flanagan, Matthew Flatt, Shriram Krishnamurthi, Paul Steckler, Matthias Felleisen
J. Funct. Program.3
2001 Detecting race conditions in large programs
abstract
The race condition checker \rcc{} statically identifies potential races in concurrent Java programs. This paper describes improvements to \rcc{} that enable it to be used on large, realistic programs. These improvements include not only extensions to the underlying analysis, but also an annotation inference algorithm and a user interface to help programmers understand warnings generated by the tool. Experience with programs containing up to 500,000 lines of code indicate that it is an effective tool for identifying races in large-scale software systems.
Cormac Flanagan, Stephen N. Freund
PASTE1
2001 Avoiding exponential explosion: generating compact verification conditions
abstract
Current verification condition (VC) generation algorithms, such as weakest preconditions, yield a VC whose size may be exponential in the size of the code fragment being checked. This paper describes a two-stage VC generation algorithm that generates compact VCs whose size is worst-case quadratic in the size of the source fragment, and is close to linear in practice.This two-stage VC generation algorithm has been implemented as part of the Extended Static Checker for Java. It has allowed us to check large and complex methods that would otherwise be impossible to check due to time and space constraints.
Cormac Flanagan, James B. Saxe
POPL1
2001 Annotation inference for modular checkers
Cormac Flanagan, Rajeev Joshi, K. Rustan M. Leino
Inf. Process. Lett.1
2000 Type-based race detection for Java
abstract
This paper presents a static race detection analysis for multithreaded Java programs. Our analysis is based on a formal type system that is capable of capturing many common synchronization patterns. These patterns include classes with internal synchronization, classes thatrequire client-side synchronization, and thread-local classes. Experience checking over 40,000 lines of Java code with the type system demonstrates that it is an effective approach for eliminating races conditions. On large examples, fewer than 20 additional type annotations per 1000 lines of code were required by the type checker, and we found a number of races in the standard Java libraries and other test programs.
Cormac Flanagan, Stephen N. Freund
PLDI1
1999 Object Types against Races
Cormac Flanagan, Martín Abadi
CONCUR1
1999 Types for Safe Locking
Cormac Flanagan, Martín Abadi
ESOP1
1999 The Semantics of Future and an Application
abstract
The future annotation of MultiLisp provides a simple method for taming the implicit parallelism of functional programs. Prior research on future has concentrated on implementation and design issues, and has largely ignored the development of a semantic characterization of future . This paper considers an idealized functional language with futures and presents a series of operational semantics with increasing degrees of intensionality. The first semantics defines future to be a semantically transparent annotation. The second semantics interprets a future expression as a potentially parallel task. The third semantics explicates the coordination of parallel tasks by introducing placeholder objects and touch operations. We use the last semantics to derive a program analysis algorithm and an optimization algorithm that removes provably redundant touch operations. Experiments with the Gambit compiler indicate that this optimization significantly reduces the overhead imposed by touch operations.
Cormac Flanagan, Matthias Felleisen
J. Funct. Program.1
1999 Componential Set-Based Analysis
abstract
Set-based analysis (SBA) produces good predictions about the behavior of functional and object-oriented programs. The analysis proceeds by inferring constraints that characterize the data flow relationships of the analyzed program. Experiences with MrSpidey, a static debugger based on SBA, indicate that SBA can adequately deal with programs of up to a couple of thousand lines of code. SBA fails, however, to cope with larger programs because it generates systems of constraints that are at least linear, and possibility quadratic, in the size of the analyzed program. This article presents theoretical and practical results concerning methods for reducing the size of constraint systems. The theoretical results include of proof-theoretic characterization of the observable behavior of constraint systems for program components, and a complete algorithm for deciding the observable equivalence of constraint systems. In the course of this development we establish a close connection between the observable equivalence of constraint systems and the equivalence of regular-tree grammars. We then exploit this connection to adapt a variety of algoirthms for simplifying grammars to the problem of simplifying constraint systems. Based on the resulting algorithms, we have developed componential set-based analysis , a modular and polymorphic variant of SBA. Experimental results verify the effectiveness of the simplification algorithms and the componential analysis. The simplified constraint systems are typically an order of magnitude smaller than the original systems. These reductions in size produce significant gains in the speed of the analysis.
Cormac Flanagan, Matthias Felleisen
ACM Trans. Program. Lang. Syst.1
1997 Componential Set-Based Analysis
abstract
Set based analysis is a constraint-based whole program analysis that is applicable to functional and object-oriented programming language. Unfortunately, the analysis is useless for large programs, since it generates descriptions of data flow relationships that grow quadratically in the size of the program.This paper presents componential set-based analysis, which is faster and handles larger programs without any loss of accuracy over set-based analysis. The design of the analysis exploits a number of theoretical results concerning constraint systems, including a completeness result and a decision algorithm concerning the observable equivalance of constraint systems. Experimental results validate the practically of the analysis.
Cormac Flanagan, Matthias Felleisen
PLDI1
1996 pHluid: The Design of a Parallel Functional Language Implementation on Workstations
abstract
This paper describes the distributed memory implementation of a shared memory parallel functional language. The language is Id, an implicitly parallel, mostly functional language that is currently evolving into a dialect of Haskell. The target is a distributed memory machine, because we expect these to be the most widely available parallel platforms in the future. The difficult problem is to bridge the gap between the shared memory language model and the distributed memory machine model. The language model assumes that all data is uniformly accessible, whereas the machine has a severe memory hierarchy: a processor's access to remote memory (using explicit communication) is orders of magnitude slower than its access to local memory. Thus, avoiding communication is crucial for good performance. The Id language, and its general dataflow-inspierd compilation to multithreaded code are described elsewhere. In this paper, we focus on our new parallel runtime system and its features for avoiding communication and for tolerating its latency when necessary: multithreading, scheduling and load balancing; the distributed heap model and distributed coherent cacheing, and parallel garbage collection. We have completed the first implementation, and we present some preliminary performance mearsurements.
Cormac Flanagan, Rishiyur S. Nikhil
ICFP1
1996 Static Debugging: Browsing the Web of Program Invariants
abstract
MrSpidey is a user-friendly, interactive static debugger for Scheme. A static debugger supplements the standard debugger by analyzing the program and pinpointing those program operations that may cause run-time errors such as dereferencing the null pointer or applying non-functions. The program analysis of MrSpidey computes value set descriptions for each term in the program and constructs a value flow graph connecting the set descriptions. Using the set descriptions, MrSpidey can identify and highlight potentially erroneous program operations, whose cause the programmer can then explore by selectively exposing portions of the value flow graph.
Cormac Flanagan, Matthew Flatt, Shriram Krishnamurthi, Stephanie Weirich, Matthias Felleisen
PLDI1
1995 The Semantics of Future and Its Use in Program Optimizations
abstract
The future annotations of MultiLisp provide a simple method for taming the implicit parallelism of functional programs. Past research concerning futures has focused on implementation issues. In this paper, we present a series of operational semantics for an idealized functional language with futures with varying degrees of intensionality. We develop a set-based analysis algorithm from the most intensional semantics, and use that algorithm to perform touch optimization on programs. Experiments with the Gambit compiler indicates that this optimization substantially reduces program execution times. 1 Implicit Parallelism via Annotations Programs in functional languages offer numerous opportunities for executing program components in parallel. In a call-by-value language, for example, the evaluation of every function application could spawn a parallel thread for each sub-expression. However, if such a strategy were applied indiscriminately, the execution of a program would generate far t...
Cormac Flanagan, Matthias Felleisen
POPL1
1993 The Essence of Compiling with Continuations
abstract
In order to simplify the compilation process, many compilers for higher-order languages use the continuation-passing style (CPS) transformation in a first phase to generate an intermediate representation of the source program. The salient aspect of this intermediate form is that all procedures take an argument that represents the rest of the computation (the “continuation”). Since the nai¨ve CPS transformation considerably increases the size of programs, CPS compilers perform reductions to produce a more compact intermediate representation. Although often implemented as a part of the CPS transformation, this step is conceptually a second phase. Finally, code generators for typical CPS compilers treat continuations specially in order to optimize the interpretation of continuation parameters.
Cormac Flanagan, Amr Sabry, Bruce F. Duba, Matthias Felleisen
PLDI1