Publications

Stats

View publication

Title Gradual C0: Symbolic Execution for Gradual Verification
Authors Jenna DiVincenzo, Ian McCormack, Hemant Gouni, Jacob Gorenburg, Jan-Paul Ramos-Dávila, Mona Zhang, Conrad Zimmerman, Joshua Sunshine, Éric Tanter, Jonathan Aldrich
Publication date January 2025
Abstract Current static verification techniques such as separation
logic
support a wide range of programs. However, such techniques only support
complete and detailed specifications, which places an undue burden on users.
To solve this problem, prior work proposed gradual verification, which
handles complete, partial, or missing specifications by soundly combining
static and dynamic checking. Gradual verification has also been extended to
programs that manipulate recursive, mutable data structures on the heap.
Unfortunately, this extension does not reward users with decreased dynamic
checking as more specifications are written and more static guarantees are
made. In fact, all properties are checked dynamically regardless of any
static guarantees. Additionally, no full-fledged implementation of gradual
verification exists so far, which prevents studying its performance and
applicability in practice.
We present Gradual C0, the first practicable gradual verifier for recursive
heap data structures, which targets C0, a safe subset of C designed for
education. Static verifiers supporting separation logic or implicit dynamic
frames use symbolic execution for reasoning; so Gradual C0, which extends
one such verifier, adopts symbolic execution at its core instead of the
weakest liberal precondition approach used in prior work. Our approach
addresses technical challenges related to symbolic execution with imprecise
specifications, heap ownership, and branching in both program statements and
specification formulas. We also deal with challenges related to minimizing
insertion of dynamic checks and extensibility to other programming languages
beyond C0. Finally, we provide the first empirical performance evaluation of
a gradual verifier, and found that on average, Gradual C0 decreases run-time
overhead between 7.1 and 40.2% compared to the fully dynamic approach used
in prior work (for context, the worst cases for the approach by Wise et al.
[2020] range from 0.1 to 4.5 seconds depending on the benchmark). Further,
the worst-case scenarios for performance are predictable and avoidable. This
work paves the way towards evaluating gradual verification at
scale.
Pages 14:1-14:57
Volume 46
Journal name ACM Transactions on Programming Languages and Systems
Publisher ACM Press (New York, NY, USA)
Reference URL View reference page