Demonstration venue · read-only. Every page can be browsed; the buttons that would change it are switched off. Create an account to run TaxoReview on your own data. A simulation from public publication records: the people listed were not invited and did not agree to review.
? Tutorial for this page

John Toman

dblp:129/2319 · DBLP profile ↗
← Back
6ranked-venue papers
5as first author
1since 2021 · last 2024
0009-0005-1015-1624ORCID · corroborated

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

Software engineering, systems software and programming languages · 6 · 5 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
3 papers
Program verification · 50% Program analysis · 25% Compilers and program optimization · 19%
Network and information security
1 paper
Systems and software security · 100%

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

TopicWeightPapersLastEvidence papers
Compilers and program optimization › compiler optimization
memory partitioning
0.812024
Practical Verification of Smart Contracts using Memory Splitting · Proc. ACM Program. Lang. 2024
Program verification › code-level verification
smart contract verification
0.812024
Practical Verification of Smart Contracts using Memory Splitting · Proc. ACM Program. Lang. 2024
Program verification
SMT-based verification
0.812024
Practical Verification of Smart Contracts using Memory Splitting · Proc. ACM Program. Lang. 2024
Program analysis › static analysis
abstract interpretation
0.412019
Concerto: a framework for combined concrete and abstract interpretation · Proc. ACM Program. Lang. 2019
Program analysis
static analysis
0.412019
Concerto: a framework for combined concrete and abstract interpretation · Proc. ACM Program. Lang. 2019
Program analysis › static analysis
pointer analysis
0.212024
Practical Verification of Smart Contracts using Memory Splitting · Proc. ACM Program. Lang. 2024
Systems and software security
memory safety
0.212015
Crust: A Bounded Verifier for Rust (N) · ASE 2015
Systems and software security › memory safety
unsafe code verification
0.212015
Crust: A Bounded Verifier for Rust (N) · ASE 2015
Program verification › model checking
bounded model checking
0.212015
Crust: A Bounded Verifier for Rust (N) · ASE 2015
Program verification › security property verification
memory safety verification
0.212015
Crust: A Bounded Verifier for Rust (N) · ASE 2015
Programming languages and type systems
metaprogramming
0.112019
Concerto: a framework for combined concrete and abstract interpretation · Proc. ACM Program. Lang. 2019
Programming languages and type systems › metaprogramming
reflection
0.112019
Concerto: a framework for combined concrete and abstract interpretation · Proc. ACM Program. Lang. 2019

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

pointer analysis · 0.8memory allocation recovery · 0.8SMT solving · 0.8exhaustive test generation · 0.4bounded model checking · 0.4concrete interpretation · 0.4abstract interpretation · 0.4
YearPublicationVenuePosition
2024 Practical Verification of Smart Contracts using Memory Splitting
abstract
SMT-based verification of low-level code requires modeling and reasoning about memory operations. Prior work has shown that optimizing memory representations is beneficial for scaling verification—pointer analysis, for example can be used to split memory into disjoint regions leading to faster SMT solving. However, these techniques are mostly designed for C and C++ programs with explicit operations for memory allocation which are not present in all languages. For instance, on the Ethereum virtual machine, memory is simply a monolithic array of bytes which can be freely accessed by Ethereum bytecode, and there is no allocation primitive. In this paper, we present a memory splitting transformation guided by a conservative memory analysis for Ethereum bytecode generated by the Solidity compiler. The analysis consists of two phases: recovering memory allocation and memory regions, followed by a pointer analysis. The goal of the analysis is to enable memory splitting which in turn speeds up verification. We have implemented both the analysis and the memory splitting transformation as part of a verification tool, CertoraProver, and show that the transformation speeds up SMT solving by up to 120× and additionally mitigates 16 timeouts when used on 229 real-world smart contract verification tasks.
Shelly Grossman, John Toman, Alexander Bakst, Sameer Arora, Shmuel Sagiv, Chandrakana Nandi
Proc. ACM Program. Lang.2
2020 ConSORT: Context- and Flow-Sensitive Ownership Refinement Types for Imperative Programs
abstract
Abstract We present ConSORT, a type system for safety verification in the presence of mutability and aliasing. Mutability requires strong updates to model changing invariants during program execution, but aliasing between pointers makes it difficult to determine which invariants must be updated in response to mutation. Our type system addresses this difficulty with a novel combination of refinement types and fractional ownership types. Fractional ownership types provide flow-sensitive and precise aliasing information for reference variables. ConSORT interprets this ownership information to soundly handle strong updates of potentially aliased references. We have proved ConSORT sound and implemented a prototype, fully automated inference tool. We evaluated our tool and found it verifies non-trivial programs including data structure implementations.
John Toman, Ren Siqi, Kohei Suenaga, Atsushi Igarashi, Naoki Kobayashi 0001
ESOP1
2019 Concerto: a framework for combined concrete and abstract interpretation
abstract
Abstract interpretation promises sound but computable static summarization of program behavior. However, modern software engineering practices pose significant challenges to this vision, specifically the extensive use of frameworks and complex libraries. Frameworks heavily use reflection, metaprogramming, and multiple layers of abstraction, all of which confound even state-of-the-art abstract interpreters. Sound but conservative analysis of frameworks is impractically imprecise, and unsoundly ignoring reflection and metaprogramming is untenable given the prevalence of these features. Manually modeling framework behaviors offers excellent precision, at the cost of immense effort by the tool designer. To overcome the above difficulties, we present Concerto, a system for analyzing framework-based applications by soundly combining concrete and abstract interpretation. Concerto analyzes framework implementations using concrete interpretation, and application code using abstract interpretation. This technique is possible in practice as framework implementations typically follow a single path of execution when provided a concrete, application-specific configuration file which is often available at analysis time. Concerto exploits this configuration information to precisely resolve reflection and other metaprogramming idioms during concrete execution. In contrast, application code may have infinitely many paths of execution, so Concerto switches to abstract interpretation to analyze application code. Concerto is an analysis framework, and can be instantiated with any abstract interpretation that satisfies a small set of preconditions. In addition, unlike manual modeling, Concerto is not specialized to any specific framework implementation. We have formalized our approach and proved several important properties including soundness and termination. In addition, we have implemented an initial proof of concept prototype of Concerto for a subset of Java, and found that our combined interpretation significantly improves analysis precision and performance.
John Toman, Dan Grossman
Proc. ACM Program. Lang.1
2018 Legato: An At-Most-Once Analysis with Applications to Dynamic Configuration Updates
abstract
Modern software increasingly relies on external resources whose location or content can change during program execution. Examples of such resources include remote network hosts, database entries, dynamically updated configuration options, etc. Long running, adaptable programs must handle these changes gracefully and correctly. Dealing with all possible resource update scenarios is difficult to get right, especially if, as is common, external resources can be modified without prior warning by code and/or users outside of the application's direct control. If a resource unexpectedly changes during a computation, an application may observe multiple, inconsistent states of the resource, leading to incorrect program behavior. This paper presents a sound and precise static analysis, Legato, that verifies programs correctly handle changes in external resources. Our analysis ensures that every value computed by an application reflects a single, consistent version of every external resource's state. Although consistent computation in the presence of concurrent resource updates is fundamentally a concurrency issue, our analysis relies on the novel at-most-once condition to avoid explicitly reasoning about concurrency. The at-most-once condition requires that all values depend on at most one access of each resource. Our analysis is flow-, field-, and context-sensitive. It scales to real-world Java programs while producing a moderate number of false positives. We applied Legato to 10 applications with dynamically updated configurations, and found several non-trivial consistency bugs.
John Toman, Dan Grossman
ECOOP1
2016 Staccato: A Bug Finder for Dynamic Configuration Updates
abstract
Modern software applications are highly configurable, allowing configuration options to be changed even during program execution. When dynamic configuration updating is implemented incorrectly, program errors can result. These program errors occur primarily when stale data—computed from old configurations—or inconsistent data—computed from different configurations—are used. We introduce Staccato, the first tool designed to detect these errors. Staccato uses a dynamic analysis in the style of taint analysis to find the use of stale configuration data in Java programs. It supports concurrent programs running on commodity JVMs. In some cases, Staccato can provide automatic bug avoidance and semi-automatic repair when errors occur. We evaluated Staccato on 3 open-source applications that support complex reconfigurability. Staccato found multiple errors in all of them. Staccato requires only modest annotation overhead and has moderate performance overhead.
John Toman, Dan Grossman
ECOOP1
2015 Crust: A Bounded Verifier for Rust (N)
abstract
Rust is a modern systems language that provides guaranteed memory safety through static analysis. However, Rust includes an escape hatch in the form of "unsafe code," which the compiler assumes to be memory safe and to preserve crucial pointer aliasing invariants. Unsafe code appears in many data structure implementations and other essential libraries, and bugs in this code can lead to memory safety violations in parts of the program that the compiler otherwise proved safe. We present CRUST, a tool combining exhaustive test generation and bounded model checking to detect memory safety errors, as well as violations of Rust's pointer aliasing invariants within unsafe library code. CRUST requires no programmer annotations, only an indication of the modules to check. We evaluate CRUSTon data structures from the Rust standard library. It detects memory safety bugs that arose during the library's development and remained undetected for several months.
John Toman, Stuart Pernsteiner, Emina Torlak
ASE1