Problem Catalogue

Every VSComp edition publishes a set of precisely specified verification challenges. This page collects all problems across every competition year into a single browsable catalogue, organised by domain, difficulty, and artifact type.

Illustration of formal verification challenge documents arranged on a desk, representing the VSComp problem catalogue

Anatomy of a VSComp Problem

A VSComp problem is not a conventional programming exercise. Each challenge consists of a formal specification — a precise, mathematical description of the expected behaviour — paired with either a reference implementation or the requirement to produce one. Participants must then provide a machine-checkable proof that the implementation satisfies the specification.

In practice, a typical submission includes three artifacts: annotated source code (with preconditions, postconditions, and loop invariants), a formal specification written in the language of the chosen proof assistant or verification tool, and the proof itself. Some problems additionally require complexity arguments, concurrency proofs, or refinement mappings. The exact requirements vary by problem and are documented in each problem's description.

The difficulty of these challenges comes not from algorithmic complexity in the competitive-programming sense, but from the subtlety of stating and proving the right properties. A sorting routine may seem straightforward until you must formally prove that the output is a permutation of the input, not merely that it is ordered. Similarly, verifying a concurrent data structure demands reasoning about interleavings, atomicity, and memory models that have no analogue in sequential programming.

Domains Represented in the Catalogue

Problems in the catalogue span a range of verification domains. Each domain tests different proof techniques and tool capabilities. The following domains appear across the four competition years:

  • Assertional verification — classical Hoare-style reasoning over sequential code, with preconditions, postconditions, and loop invariants.
  • Data structures — proving structural invariants of trees, lists, and other linked structures through pointer manipulation.
  • Concurrency — verifying thread-safe data structures, lock-free algorithms, and shared-state protocols under concurrent access.
  • Refinement — establishing formal relationships between abstract specifications and concrete implementations using simulation or trace inclusion.
  • Systems verification — proving properties of realistic software components such as editors, servers, and storage engines.
  • Amortized complexity — formally bounding the amortized cost of operations using potential functions or equivalent techniques.
  • Hybrid systems — verifying safety properties of controllers that combine continuous dynamics with discrete mode switches.
  • Security protocols — proving confidentiality, authentication, or integrity properties under adversary models.
  • Specification completeness — meta-level reasoning about whether a specification covers all relevant behaviours.
  • Functional correctness — general-purpose correctness proofs for algorithms and compilers.
  • Text processing — proving correctness of pattern-matching, parsing, and string-manipulation routines.

Not every domain appears in every year. The years index shows which domains were featured in each edition. For the evaluation approach used to assess submissions, see the rules page.

Browse by Category

Use the categories below to orient yourself within the catalogue. Problems are displayed in chronological order by default.

By year: 2010201420152017
By domain: Amortized complexityAssertional verificationConcurrencyData structuresFunctional correctnessHybrid systemsRefinementSecurity protocolsSpecification completenessSystems verificationText processing
By difficulty: IntroductoryMediumHard
By artifact type: Annotated source + proofSpecification + proofModel + proof

VSComp 2010

P1-2010Sorting Verification
2010Annotated source + proof

Prove that a given sorting algorithm correctly produces a permutation of its input in non-decreasing order. Requires loop invariants, termination arguments, and a clear specification of what it means for the output to be sorted.

Assertional verificationIntroductory
P2-2010Binary Search Tree Invariants
2010Annotated source + proof

Verify that insertion and lookup operations on a binary search tree maintain the BST invariant. Participants must formalise the ordering property and show it is preserved across all operations.

Data structuresMedium
P3-2010Array Partitioning
2010Annotated source + proof

Prove correctness of a partitioning routine that separates an array into elements below and above a pivot value. Classic loop-invariant reasoning with attention to index boundaries.

Assertional verificationIntroductory
P4-2010Linked List Reversal
2010Annotated source + proof

Verify an in-place reversal of a singly linked list. The challenge lies in specifying and preserving the relationship between the original and reversed sequences through pointer manipulation.

Data structuresMedium
P5-2010Maximum Subarray Sum
2010Annotated source + proof

Prove that a linear-time algorithm correctly computes the maximum contiguous subarray sum. Requires careful loop invariant formulation and boundary case reasoning.

Assertional verificationMedium

VSComp 2014

P1-2014Concurrent Queue
2014Source + concurrency proof

Verify a lock-free concurrent queue implementation. Participants must show linearisability or an equivalent correctness condition under concurrent access from multiple threads.

ConcurrencyHard
P2-2014Refinement Mapping
2014Specification + refinement proof

Establish a refinement mapping between an abstract specification and a concrete implementation of a stateful component. Demonstrate trace inclusion or simulation.

RefinementHard
P3-2014Monotonic Counter
2014Source + concurrency proof

Verify that a shared monotonic counter maintains its invariant — the counter value never decreases — under concurrent increments. Requires reasoning about atomicity and memory ordering.

ConcurrencyMedium
P4-2014Priority Queue Correctness
2014Annotated source + proof

Prove the correctness of a priority queue implementation, showing that extraction always returns the minimum element and that the heap property is maintained through all operations.

Functional correctnessMedium
P5-2014State Machine Equivalence
2014Specification + proof

Show bisimulation equivalence between two state machine specifications. Requires constructing the bisimulation relation and proving it satisfies the transfer conditions.

RefinementHard

VSComp 2015

P1-2015Text Editor Buffer
2015Source + specification + proof

Verify the core operations of a gap-buffer–based text editor: insertion, deletion, and cursor movement. The challenge tests whether verification tools can handle realistic stateful data structures with complex internal invariants.

Systems verificationHard
P2-2015DNS Server Components
2015Source + specification + proof

Verify key components of a simplified DNS resolver, including query parsing, cache lookup, and response construction. Participants must specify the expected behaviour at the network-message level.

Systems verificationHard
P3-2015Queue with Amortized Complexity
2015Source + complexity proof

Prove both functional correctness and amortized O(1) complexity for a two-stack queue implementation. Requires a potential function argument or equivalent amortized analysis technique formalised in the proof assistant.

Amortized complexityHard
P4-2015Log-Structured Storage
2015Source + specification + proof

Verify append and compaction operations of a simplified log-structured storage engine. Participants must show crash consistency: the data structure remains valid even if an operation is interrupted.

Systems verificationMedium
P5-2015String Matching
2015Annotated source + proof

Prove that a string-matching algorithm correctly identifies all occurrences of a pattern within a text. Requires careful index arithmetic and completeness arguments.

Text processingMedium

VSComp 2017

P1-2017Hybrid Controller Safety
2017Model + safety proof

Verify safety properties of a hybrid controller that alternates between continuous dynamics and discrete mode switches. Participants must formalise the continuous invariant and show it is preserved across mode transitions.

Hybrid systemsHard
P2-2017Secure Message Passing
2017Protocol model + proof

Verify confidentiality and authentication properties of a simplified secure messaging protocol. The specification must account for an active adversary model within stated assumptions.

Security protocolsHard
P3-2017Specification Completeness Check
2017Specification + analysis

Given a partial specification of a component, identify missing cases and complete the specification so that no unspecified behaviours remain. This meta-level challenge asks participants to reason about what a specification omits.

Specification completenessMedium
P4-2017Distributed Consensus Round
2017Protocol model + proof

Verify a single round of a consensus protocol in a distributed setting with crash faults. Participants must prove agreement and validity properties under the stated fault model.

ConcurrencyHard
P5-2017Verified Compiler Pass
2017Source + semantic preservation proof

Prove that a simple compiler optimisation pass preserves the semantics of the source language. Requires defining an operational semantics and showing a simulation relation.

Functional correctnessHard
Solutions

Submitted solutions for these problems are collected in the solutions archive, grouped by year and problem. Each entry describes the verification approach, tools used, and the degree of completeness achieved.

Rules & Evaluation

The rules page describes how submissions are evaluated, including the criteria for correctness, completeness, and clarity that reviewers apply to each solution.