Playground

Analyze VIMP in your browser

VIMP is a small IMP-style language with __voblint_check(cond) assertions. The analysis runs locally, in WebAssembly compiled from Voblint_Generated.ml, the OCaml Isabelle generated from the verified theories; your source is not uploaded. Parsing, rendering and this page sit outside the verified component. How it works explains every setting and every mark below.

Analyses
Flow-sensitive keeps every global in each point's own state. Flow-insensitive assigns each global an unknown, read by points that use it. This placement applies to analyses whose states split by variable. The order analysis retains its whole relational state at each point. Warrowing a flow-insensitive global can fail to stabilize. Flow-insensitive therefore selects bounded narrowing unless you chose a rule explicitly.
Number of recent call sites kept in each context, from 0 to 100.

Loading the editor…

example.vimp

Run with Ctrl/⌘ + Enter while editing. Examples opens any program of the regression suite with its settings.

✓ PROVEDholds in every run that reaches the check ✗ REFUTEDfails in every run that reaches it ? UNKNOWNundecided, or contexts disagree ∅ DEADno context reaches it
⚠ WARNINGa divisor may be zero ✗ ERRORa divisor is zero in every live context
x: [2,2]what a statement assigns; → callee parameters, ↩ a return; ⇢ a write to a flow-insensitive global, final that global's final value ⊔ i: [0,5]paths meet, so the value covers more than this step
run_voblint: call and answer Analyzer input, returned report, and solver trace.

Input to the Isabelle-generated run_voblint function, and its returned answer after render_report, which converts states to text. The output is serialized field by field using Isabelle's field and constructor names. Each abstract value is rendered by its own analysis; the presentation layer only replaces ASCII symbol names such as <top> with glyphs such as ⊤. Integers too large for a JSON number appear as strings. The editor annotations, state inspector, and graph are drawn from this answer by untrusted presentation code.

Run the analysis to see the call and its answer.

Solver steps recorded during the run, as printed by voblint --trace --verbose. The trace includes solved unknowns, queries and answers, side effects, updates, destabilizations, and call routing. It uses Goblint-aligned terms and indentation for query depth. A banner marks where the solver asks for a procedure's result.

The solver result is the exported computation of proved equations, and the trace calls come from code equations proved equal to the untraced ones. The trace is an unverified observation of that computation, recorded by a hook that returns nothing, swallows exceptions and never touches solver state. The solve replay further down is an unverified visualization of the trace.

Regression suite

Open an example

Every program the regression suite runs, opened with the settings its // PARAM: header selects. The program comments name the verdict each check is expected to reach.