We present <i>Logically Qualified Data Types</i>, abbreviated to <i>Liquid Types</i>, a system that combines <i>Hindley-Milner</i> type inference with <i>Predicate Abstraction</i> to automatically infer dependent types precise enough to prove a variety of safety properties. Liquid types allow programmers to reap many of the benefits of dependent types,… (More)
In this paper, we describe SymDiff, a language-agnostic tool for equivalence checking and displaying semantic (behavioral) differences over imperative programs. The tool operates on an intermediate verification language Boogie, for which translations exist from various source languages such as C, C# and x86. We discuss the tool and the front-end interface… (More)
We present a refinement type-based approach for the static verification of complex data structure invariants. Our approach is based on the observation that complex data structures are typically fashioned from two elements: recursion (e.g., lists and trees), and maps (e.g., arrays and hash tables). We introduce two novel type-based mechanisms targeted… (More)
We present <i>Low-Level Liquid Types </i>, a refinement type system for C based on <i>Liquid Types </i>. Low-Level Liquid Types combine refinement types with three key elements to automate verification of critical safety properties of low-level programs: First, by associating refinement types with individual heap locations and precisely tracking the… (More)
In this paper, we present a general framework for modularly comparing two (imperative) programs that can leverage single-program verifiers based on automated theorem provers. We formalize (i) mutual summaries for comparing the summaries of two programs, and (ii) relative termination to describe conditions under which two programs relatively terminate. The… (More)
Shared memory multithreading is a popular approach to parallel programming, but also fiendishly hard to get right. We present <i>Liquid Effects</i>, a type-and-effect system based on refinement types which allows for fine-grained, low-level, shared memory multi-threading while statically guaranteeing that a program is deterministic. Liquid Effects records… (More)
We present Dsolve, a verification tool for OCaml. Dsolve automates verification by inferring " Liquid " refinement types that are expressive enough to verify a variety of complex safety properties. 1 Overview Refinement types are a means of expressing rich program invariants by combining classical types with logical predicates. For example, using refinement… (More)
We present CSolve, an automated verifier for C programs based on Liquid Type inference. We show how CSolve verifies memory safety through an example and describe its architecture and interface.