Browse documentation
Changelog
On this page
All notable changes to QuickProof are documented in this file. The format is based on Keep a Changelog, and QuickProof follows Semantic Versioning.
Unreleased
0.1.0 - 2026-11-02
The first public release. QuickProof needs Coq 8.20.1, CompCert 3.15 and VST 2.15, and works on 64-bit x86
Linux. qp import-fuzz of libFuzzer targets is stable. The other importers and qp fuzz --libfuzzer are
previews: they work and are tested on real harnesses, but their interfaces and what they cover may change.
Added
include/quickproof.h, the environment of a harness:nondet_u8,nondet_u32,nondet_size,nondet_bytesandpickfor inputs,qp_assumeto restrict them,qp_assertfor properties. The last two are macros forgp_assumeandgp_assert, the names the Clight,Env.vand the messages of the tools use; specs may write either.coq/QuickProof/Env.vandContract.v: the specifications of the environment functions andharness_safe, the statement of every theorem. These andquickproof.hdefine what a theorem means; they contain no axioms. The whole trusted base, including the translation scripts andqp verify, is listed in What a proof means.coq/QuickProof/EnvBodies.v,Pick.v,Link.vandAssembly.v: proofs of the environment functions' bodies, and lemmas for linking units and assembling a whole-program proof.libc/: plain-Cmemcpy,memmove,memset,memcmp,callocand string functions, and the unit that ownsmallocandfree, proved together with the code that uses them.tools/clight.sh,tools/new_contract.pyandtools/link_units.py: the C units of a project to Clight withclightgen, and one theorem per harness and their conjunctionsuite, over the whole program or, withLINK=per-law, over the units each harness needs.tools/clight_audit.py: the constructs in the generated Clight that VST cannot handle.qp newandqp tree: a project pinned to an upstream commit and a framework commit, and the code under test with its idiom patch.qp lint,audit,fuzz,interp,mutantsandcheck: the checks before any proof work. The VST lint, native runs under AddressSanitizer and UndefinedBehaviorSanitizer, runs under CompCert's reference interpreter, and broken versions of the code that each harness should notice.qp assemble: the proof repository, with the framework as a submodule and every theorem stated and unproved in the commit taggedcontract.qp verify: the acceptance check of a proof, from a fresh clone. It refuses a repository without the layout thatqp assemblemakes, a framework whose files differ from those of the verifier, aquickproof.confthat is more than assignments (tools/conf.py, which every tool that reads a conf uses), and options or Coq commands that load code or switch off a kernel check. It then checks the frozen files, the regenerated Clight, that every statement is theharness_safeof the program generated from its harness, that nothing isAdmitted, and that only the allowed axioms are used, and it compares the framework with its own again after the translation and the builds. Without a contract commit the result is UNVERIFIED, never PASS.--coqchkalso runs Coq's checker. It prints its progress on stderr, stops before the build when a frozen file has changed, and on a terminal ends with the table of theorems and the verdict only (--brief;VERIFY.mdhas the full report). An interrupted run is resumed by the next one on the same commit (--freshstarts over). It builds the repository's Coq sources, so run it on an untrusted one in a container.qp exportandqp rebuild: a verified proof kept in the workspace, and rebuilt from its recorded commits.qp import-fuzz: a law from a libFuzzer target, unchanged; with--style afl|honggfuzz, from AFL++ persistent-mode and honggfuzzHF_ITERharnesses, and with--entry,--initand--cleanup, from other entry points.qp replayruns an imported law on given inputs, andqp fidelitycompares imported laws with the original targets built the upstream way.qp import-cbmc: a law from a CBMC proof harness, without CBMC's unwinding bound.qp import-svcomp: a law from an SV-COMP verification task, and--verdictsto compare imported laws with the tasks' expected verdicts.qp fuzz --libfuzzer: every law as a coverage-guided libFuzzer target on the unmodified upstream, with a native replay of each crash.qp examplesandexamples/: three small libraries (a run-length decoder, Adler-32, a byte search), each with a law and its proof, checked offline with the framework they ship in.tools/fuzz/determinism.sh: imported laws regenerate byte for byte in other directories and environments.runtime/fuzz_driver.c,runtime/interp_driver.c,tools/interp.shandtools/fuzz_gate.sh: native and interpreter runs of a harness, and a check that its assumptions let inputs reach its assertions.docker/: the Docker imageghcr.io/genproof/quickproof, with the toolchain, QuickProof, the examples, the MCP server rocq-mcp and the commandqpdemo: check the examples' proofs, or prove a property of your own code by hand or with an AI agent you bring (The Docker image).docker/build.shbuilds it from a checkout.- Documentation in
docs/: an overview, what a theorem guarantees and relies on, which code fits, writing harnesses, a step-by-step recipe, linking several laws, theqpcommand, the three importers, and known issues. - Tests:
tests/run.shbuilds the Coq library, proves a toy suite, runstests/qp.sh(everyqpcommand end to end on toy projects, offline) and checks the examples.