Francesco Logozzo

dblp:92/3 · DBLP profile ↗
← Back
29ranked-venue papers
11as first author
1since 2021 · last 2025
0009-0005-4348-322XORCID · corroborated

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

Software engineering, systems software and programming languages · 28 · 11 first-author · 1 since 2021

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
11 papers
Program verification · 46% Program analysis · 36% Runtime systems and virtual machines · 9%
Network and information security
1 paper
Systems and software security · 100%

Topics — the 26 heaviest of 27, each with the papers that count most for it

TopicWeightPapersLastEvidence papers
Program analysis
static analysis
1.552025
Revealing Sources of (Memory) Errors via Backward Analysis · Proc. ACM Program. Lang. 2025
Automatic Contract Insertion with CCBot · IEEE Trans. Software Eng. 2017
Tracing compilation by abstract interpretation · POPL 2014
Program verification › program logic
incorrectness logic
0.912025
Revealing Sources of (Memory) Errors via Backward Analysis · Proc. ACM Program. Lang. 2025
Program verification
program logic
0.912025
Revealing Sources of (Memory) Errors via Backward Analysis · Proc. ACM Program. Lang. 2025
Program verification › program logic
separation logic
0.912025
Revealing Sources of (Memory) Errors via Backward Analysis · Proc. ACM Program. Lang. 2025
Program analysis › static analysis
abstract interpretation
0.852015
Analyzing Program Analyses · POPL 2015
Tracing compilation by abstract interpretation · POPL 2014
An abstract interpretation framework for refactoring with application to extract methods with contracts · OOPSLA 2012
Runtime systems and virtual machines › dynamic compilation
just-in-time compilation
0.532016
An Abstract Interpretation-Based Model of Tracing Just-in-Time Compilation · ACM Trans. Program. Lang. Syst. 2016
Tracing compilation by abstract interpretation · POPL 2014
SPUR: a trace-based JIT compiler for CIL · OOPSLA 2010
Program verification
contract verification
0.422017
Automatic Contract Insertion with CCBot · IEEE Trans. Software Eng. 2017
Modular and verified automatic program repair · OOPSLA 2012
Software testing
fault detection
0.312017
Automatic Contract Insertion with CCBot · IEEE Trans. Software Eng. 2017
Program analysis › static analysis
bug detection
0.312025
Revealing Sources of (Memory) Errors via Backward Analysis · Proc. ACM Program. Lang. 2025
Program analysis › dynamic analysis
memory error detection
0.312025
Revealing Sources of (Memory) Errors via Backward Analysis · Proc. ACM Program. Lang. 2025
Program verification
static verification
0.212014
Verification modulo versions: towards usable verification · PLDI 2014
Debugging and program repair
automated program repair
0.112012
Modular and verified automatic program repair · OOPSLA 2012
Program verification › annotation inference
contract inference
0.112012
An abstract interpretation framework for refactoring with application to extract methods with contracts · OOPSLA 2012
Program verification
modular verification
0.112012
Modular and verified automatic program repair · OOPSLA 2012
Software maintenance and evolution
refactoring
0.112012
An abstract interpretation framework for refactoring with application to extract methods with contracts · OOPSLA 2012
Runtime systems and virtual machines › dynamic compilation › just-in-time compilation
trace-based compilation
0.112010
SPUR: a trace-based JIT compiler for CIL · OOPSLA 2010
Systems and software security
memory safety
0.112008
Safer unsafe code for .NET · OOPSLA 2008
Systems and software security › memory safety
unsafe code verification
0.112008
Safer unsafe code for .NET · OOPSLA 2008
Program verification › security property verification
memory safety verification
0.112008
Safer unsafe code for .NET · OOPSLA 2008
Program analysis › static analysis › abstract interpretation
numerical abstract domains
0.112015
Analyzing Program Analyses · POPL 2015
Program analysis › static analysis › abstract interpretation
octagon domain
0.112015
Analyzing Program Analyses · POPL 2015
Runtime systems and virtual machines
dynamic language implementation
0.112014
Tracing compilation by abstract interpretation · POPL 2014
Program verification › equivalence checking
regression verification
0.112014
Verification modulo versions: towards usable verification · PLDI 2014
Software maintenance and evolution › software configuration management
version control
0.112014
Verification modulo versions: towards usable verification · PLDI 2014
Debugging and program repair
fault localization
0.012012
Modular and verified automatic program repair · OOPSLA 2012
Runtime systems and virtual machines
managed runtime
0.012010
SPUR: a trace-based JIT compiler for CIL · OOPSLA 2010

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

abstract interpretation · 1.0under-approximation · 0.9sufficient incorrectness logic · 0.9proof system · 0.9precondition/postcondition inference · 0.3object invariants · 0.3code instrumentation · 0.3static analysis · 0.2semantic environment condition inference · 0.2forward/backward analysis · 0.1numerical abstract domains · 0.1
YearPublicationVenuePosition
2025 Revealing Sources of (Memory) Errors via Backward Analysis
abstract
Sound over-approximation methods are effective for proving the absence of errors, but inevitably produce false alarms that can hamper programmers. In contrast, under-approximation methods focus on bug detection and are free from false alarms. In this work, we present two novel proof systems designed to locate the source of errors via backward under-approximation, namely Sufficient Incorrectness Logic (SIL) and its specialization for handling memory errors, called Separation SIL. The SIL proof system is minimal, sound and complete for Lisbon triples, enabling a detailed comparison of triple-based program logics across various dimensions, including negation, approximation, execution order, and analysis objectives. More importantly, SIL lays the foundation for our main technical contribution, by distilling the inference rules of Separation SIL, a sound and (relatively) complete proof system for automated backward reasoning in programs involving pointers and dynamic memory allocation. The completeness result for Separation SIL relies on a careful crafting of both the assertion language and the rules for atomic commands.
Flavio Ascari, Roberto Bruni 0001, Roberta Gori, Francesco Logozzo
Proc. ACM Program. Lang.4
2017 Automatic Contract Insertion with CCBot
abstract
Existing static analysis tools require significant programmer effort. On large code bases, static analysis tools produce thousands of warnings. It is unrealistic to expect users to review such a massive list and to manually make changes for each warning. To address this issue we propose CCBot (short for CodeContracts Bot), a new tool that applies the results of static analysis to existing code through automatic code transformation. Specifically, CCBot instruments the code with method preconditions, postconditions, and object invariants which detect faults at runtime or statically using a static contract checker. The only configuration the programmer needs to perform is to give CCBot the file paths to code she wants instrumented. This allows the programmer to adopt contract-based static analysis with little effort. CCBot's instrumented version of the code is guaranteed to compile if the original code did. This guarantee means the programmer can deploy or test the instrumented code immediately without additional manual effort. The inserted contracts can detect common errors such as null pointer dereferences and out-of-bounds array accesses. CCBot is a robust large-scale tool with an open-source C# implementation. We have tested it on real world projects with tens of thousands of lines of code. We discuss several projects as case studies, highlighting undiscovered bugs found by CCBot, including 22 new contracts that were accepted by the project authors.
Scott A. Carr, Francesco Logozzo, Mathias Payer
IEEE Trans. Software Eng.2
2016 An Abstract Interpretation-Based Model of Tracing Just-in-Time Compilation
abstract
Tracing just-in-time compilation is a popular compilation technique for the efficient implementation of dynamic languages, which is commonly used for JavaScript, Python, and PHP. It relies on two key ideas. First, it monitors program execution in order to detect so-called hot paths, that is, the most frequently executed program paths. Then, hot paths are optimized by exploiting some information on program stores that is available and therefore gathered at runtime. The result is a residual program where the optimized hot paths are guarded by sufficient conditions ensuring some form of equivalence with the original program. The residual program is persistently mutated during its execution, for example, to add new optimized hot paths or to merge existing paths. Tracing compilation is thus fundamentally different from traditional static compilation. Nevertheless, despite the practical success of tracing compilation, very little is known about its theoretical foundations. We provide a formal model of tracing compilation of programs using abstract interpretation. The monitoring phase (viz., hot path detection) corresponds to an abstraction of the trace semantics of the program that captures the most frequent occurrences of sequences of program points together with an abstraction of their corresponding stores, for example, a type environment. The optimization phase (viz., residual program generation) corresponds to a transform of the original program that preserves its trace semantics up to a given observation as modeled by some abstraction. We provide a generic framework to express dynamic optimizations along hot paths and to prove them correct. We instantiate it to prove the correctness of dynamic type specialization and constant variable folding. We show that our framework is more general than the model of tracing compilation introduced by Guo and Palsberg [2011], which is based on operational bisimulations. In our model, we can naturally express hot path reentrance and common optimizations like dead-store elimination, which are either excluded or unsound in Guo and Palsberg’s framework.
Stefano Dissegna, Francesco Logozzo, Francesco Ranzato
ACM Trans. Program. Lang. Syst.2
2015 Analyzing Program Analyses
abstract
We want to prove that a static analysis of a given program is complete, namely, no imprecision arises when asking some query on the program behavior in the concrete (ie, for its concrete semantics) or in the abstract (ie, for its abstract interpretation). Completeness proofs are therefore useful to assign confidence to alarms raised by static analyses. We introduce the completeness class of an abstraction as the set of all programs for which the abstraction is complete. Our first result shows that for any nontrivial abstraction, its completeness class is not recursively enumerable. We then introduce a stratified deductive system to prove the completeness of program analyses over an abstract domain A. We prove the soundness of the deductive system. We observe that the only sources of incompleteness are assignments and Boolean tests --- unlikely a common belief in static analysis, joins do not induce incompleteness. The first layer of this proof system is generic, abstraction-agnostic, and it deals with the standard constructs for program composition, that is, sequential composition, branching and guarded iteration. The second layer is instead abstraction-specific: the designer of an abstract domain A provides conditions for completeness in A of assignments and Boolean tests which have to be checked by a suitable static analysis or assumed in the completeness proof as hypotheses. We instantiate the second layer of this proof system first with a generic nonrelational abstraction in order to provide a sound rule for the completeness of assignments. Orthogonally, we instantiate it to the numerical abstract domains of Intervals and Octagons, providing necessary and sufficient conditions for the completeness of their Boolean tests and of assignments for Octagons.
Roberto Giacobazzi, Francesco Logozzo, Francesco Ranzato
POPL2
2014 Verification modulo versions: towards usable verification
abstract
We introduce Verification Modulo Versions (VMV), a new static analysis technique for reducing the number of alarms reported by static verifiers while providing sound semantic guarantees. First, VMV extracts semantic environment conditions from a base program P. Environmental conditions can either be sufficient conditions (implying the safety of P) or necessary conditions (implied by the safety of P). Then, VMV instruments a new version of the program, P', with the inferred conditions. We prove that we can use (i) sufficient conditions to identify abstract regressions of P' w.r.t. P; and (ii) necessary conditions to prove the relative correctness of P' w.r.t. P. We show that the extraction of environmental conditions can be performed at a hierarchy of abstraction levels (history, state, or call conditions) with each subsequent level requiring a less sophisticated matching of the syntactic changes between P' and P. Call conditions are particularly useful because they only require the syntactic matching of entry points and callee names across program versions. We have implemented VMV in a widely used static analysis and verification tool. We report our experience on two large code bases and demonstrate a substantial reduction in alarms while additionally providing relative correctness guarantees.
Francesco Logozzo, Shuvendu K. Lahiri, Manuel Fähndrich, Sam Blackshear
PLDI1
2014 Tracing compilation by abstract interpretation
abstract
Tracing just-in-time compilation is a popular compilation schema for the efficient implementation of dynamic languages, which is commonly used for JavaScript, Python, and PHP. It relies on two key ideas. First, it monitors the execution of the program to detect so-called hot paths, i.e., the most frequently executed paths. Then, it uses some store information available at runtime to optimize hot paths. The result is a residual program where the optimized hot paths are guarded by sufficient conditions ensuring the equivalence of the optimized path and the original program. The residual program is persistently mutated during its execution, e.g., to add new optimized paths or to merge existing paths. Tracing compilation is thus fundamentally different than traditional static compilation. Nevertheless, despite the remarkable practical success of tracing compilation, very little is known about its theoretical foundations.
Stefano Dissegna, Francesco Logozzo, Francesco Ranzato
POPL2
2013 Automatic Inference of Necessary Preconditions
Patrick Cousot, Radhia Cousot, Manuel Fähndrich, Francesco Logozzo
VMCAI4
2012 Inference of Necessary Field Conditions with Abstract Interpretation
Mehdi Bouaziz, Francesco Logozzo, Manuel Fähndrich
APLAS2
2012 An abstract interpretation framework for refactoring with application to extract methods with contracts
abstract
Method extraction is a common refactoring feature provided by most modern IDEs. It replaces a user-selected piece of code with a call to an automatically generated method. We address the problem of automatically inferring contracts (precondition, postcondition) for the extracted method. We require the inferred contract: (a) to be valid for the extracted method (validity); (b) to guard the language and programmer assertions in the body of the extracted method by an opportune precondition (safety); (c) to preserve the proof of correctness of the original code when analyzing the new method separately (completeness); and (d) to be the most general possible (generality). These requirements rule out trivial solutions (e.g., inlining, projection, etc). We propose two theoretical solutions to the problem. The first one is simple and optimal. It is valid, safe, complete and general but unfortunately not effectively computable (except for unrealistic finiteness/decidability hypotheses). The second one is based on an iterative forward/backward method. We show it to be valid, safe, and, under reasonable assumptions, complete and general. We prove that the second solution subsumes the first. All justifications are provided with respect to a new, set-theoretic version of Hoare logic (hence without logic), and abstractions of Hoare logic, revisited to avoid surprisingly unsound inference rules.
Patrick Cousot, Radhia Cousot, Francesco Logozzo, Michael Barnett 0001
OOPSLA3
2012 Modular and verified automatic program repair
abstract
We study the problem of suggesting code repairs at design time, based on the warnings issued by modular program verifiers. We introduce the concept of a verified repair, a change to a program's source that removes bad execution traces while increasing the number of good traces, where the bad/good traces form a partition of all the traces of a program. Repairs are property-specific. We demonstrate our framework in the context of warnings produced by the modular cccheck (a.k.a. Clousot) abstract interpreter, and generate repairs for missing contracts, incorrect locals and objects initialization, wrong conditionals, buffer overruns, arithmetic overflow and incorrect floating point comparisons. We report our experience with automatically generating repairs for the .NET framework libraries, generating verified repairs for over 80% of the warnings generated by cccheck.
Francesco Logozzo, Thomas Ball 0001
OOPSLA1
2011 A parametric segmentation functor for fully automatic and scalable array content analysis
abstract
We introduce FunArray, a parametric segmentation abstract domain functor for the fully automatic and scalable analysis of array content properties. The functor enables a natural, painless and efficient lifting of existing abstract domains for scalar variables to the analysis of uniform compound data-structures such as arrays and collections. The analysis automatically and semantically divides arrays into consecutive non-overlapping possibly empty segments. Segments are delimited by sets of bound expressions and abstracted uniformly. All symbolic expressions appearing in a bound set are equal in the concrete. The FunArray can be naturally combined via reduced product with any existing analysis for scalar variables. The analysis is presented as a general framework parameterized by the choices of bound expressions, segment abstractions and the reduction operator. Once the functor has been instantiated with fixed parameters, the analysis is fully automatic.
Patrick Cousot, Radhia Cousot, Francesco Logozzo
POPL3
2011 Precondition Inference from Intermittent Assertions and Application to Contracts on Collections
Patrick Cousot, Radhia Cousot, Francesco Logozzo
VMCAI3
2011 Practical Verification for the Working Programmer with CodeContracts and Abstract Interpretation - (Invited Talk)
Francesco Logozzo
VMCAI1
2011 SubPolyhedra: a family of numerical abstract domains for the (more) scalable inference of linear inequalities
Vincent Laviron, Francesco Logozzo
Int. J. Softw. Tools Technol. Transf.2
2010 RATA: Rapid Atomic Type Analysis by Abstract Interpretation - Application to JavaScript Optimization
Francesco Logozzo, Herman Venter
CC1
2010 SPUR: a trace-based JIT compiler for CIL
abstract
Tracing just-in-time compilers (TJITs) determine frequently executed traces (hot paths and loops) in running programs and focus their optimization effort by emitting optimized machine code specialized to these traces. Prior work has established this strategy to be especially beneficial for dynamic languages such as JavaScript, where the TJIT interfaces with the interpreter and produces machine code from the JavaScript trace.
Michael Bebenita, Florian Brandner, Manuel Fähndrich, Francesco Logozzo, Wolfram Schulte, Nikolai Tillmann, Herman Venter
OOPSLA4
2010 Pentagons: A weakly relational abstract domain for the efficient validation of array accesses
Francesco Logozzo, Manuel Fähndrich
Sci. Comput. Program.1
2009 Refining Abstract Interpretation-Based Static Analyses with Hints
Vincent Laviron, Francesco Logozzo
APLAS2
2009 Inferring Dataflow Properties of User Defined Table Processors
Songtao Xia, Manuel Fähndrich, Francesco Logozzo
SAS3
2009 SubPolyhedra: A (More) Scalable Approach to Infer Linear Inequalities
Vincent Laviron, Francesco Logozzo
VMCAI2
2009 Class invariants as abstract interpretation of trace semantics
Francesco Logozzo
Comput. Lang. Syst. Struct.1
2008 On the Relative Completeness of Bytecode Analysis Versus Source Code Analysis
Francesco Logozzo, Manuel Fähndrich
CC1
2008 Safer unsafe code for .NET
abstract
The.NET intermediate language (MSIL) allows expressing both statically verifiable memory and type safe code (typi-cally called managed), as well as unsafe code using direct pointer manipulations. Unsafe code can be expressed in C# by marking regions of code as unsafe. Writing unsafe code can be useful where the rules of managed code are too strict. The obvious drawback of unsafe code is that it opens the door to programming errors typical of C and C++, namely memory access errors such as buffer overruns. Worse, a sin-gle piece of unsafe code may corrupt memory and destabi-lize the entire runtime or allow attackers to compromise the security of the platform. We present a new static analysis based on abstract in-terpretation to check memory safety for unsafe code in the.NET framework. The core of the analysis is a new numeri-cal abstract domain, Strp, which is used to efficiently com-pute memory invariants. Strp is combined with lightweight abstract domains to raise the precision, yet achieving scala-bility. We implemented this analysis in Clousot, a generic static analyzer for.NET. In combination with contracts ex-pressed in FoxTrot, an MSIL based annotation language for.NET, our analysis provides static safety guarantees on memory accesses in unsafe code. We tested it on all the as-semblies of the.NET framework. We compare our results with those obtained using existing domains, showing how they are either too imprecise (e.g., Intervals or Octagons) or too expensive (Polyhedra) to be used in practice.
Pietro Ferrara 0001, Francesco Logozzo, Manuel Fähndrich
OOPSLA2
2007 Cibai: An Abstract Interpretation-Based Static Analyzer for Modular Analysis and Verification of Java Classes
Francesco Logozzo
VMCAI1
2006 Semantic Hierarchy Refactoring by Abstract Interpretation
Francesco Logozzo, Agostino Cortesi
VMCAI1
2005 Loop Invariants on Demand
K. Rustan M. Leino, Francesco Logozzo
APLAS2
2005 Abstract Interpretation-Based Verification of Non-functional Requirements
Agostino Cortesi, Francesco Logozzo
COORDINATION2
2004 Automatic Inference of Class Invariants
Francesco Logozzo
VMCAI1
2003 Class-Level Modular Analysis for Object Oriented Languages
Francesco Logozzo
SAS1