2026-04-05ยท10 min readยทsota.io team

Deploy CBMC to Europe โ€” Daniel Kroening ๐Ÿ‡ฉ๐Ÿ‡ช (Oxford), the C Bounded Model Checker that Finds Bugs Amazon and Toyota Cannot, on EU Infrastructure in 2026

In 2022, Amazon Web Services published a blog post describing how a team of AWS engineers used a formal verification tool to find a security vulnerability in s2n-tls, Amazon's open-source TLS implementation, after the code had passed all standard testing. The tool converted the C source code into a mathematical formula, handed it to a SAT solver, and the solver returned a concrete program execution โ€” a sequence of inputs and operations โ€” that triggered an assertion violation. The bug was a buffer over-read that manifested only when TLS session resumption and renegotiation interacted with a specific memory layout. No fuzzer had found it. No code review had caught it. A bounded model checker had.

The tool was CBMC. The engineer who built it was Daniel Kroening ๐Ÿ‡ฉ๐Ÿ‡ช.

CBMC (C Bounded Model Checker) is a verification tool for ANSI-C and C++ programs. It takes C source code โ€” the same code you compile with GCC โ€” and automatically checks it against a set of correctness properties: no buffer overflows, no null pointer dereferences, no integer overflows, no division by zero, no out-of-bounds array accesses, and any assertion you write with assert(). To check these properties, CBMC unrolls loops up to a configurable bound, converts the resulting straight-line program into a propositional formula, and passes the formula to a SAT or SMT solver. If the solver finds a satisfying assignment, CBMC produces a concrete counterexample trace that triggers the bug. If the solver proves the formula unsatisfiable up to that bound, CBMC reports the property holds for all executions within the bound.

In 2026, CBMC is used in CI/CD pipelines at Amazon AWS, integrated into Toyota's automotive software certification process for ISO 26262, applied to NASA flight software, and run continuously in European safety-critical system development workflows targeting IEC 61508 and EU AI Act Article 9 compliance. Every EU company that writes C code for safety-critical systems โ€” automotive, medical, railway, industrial control, aerospace โ€” operates in a regulatory environment where CBMC's analysis outputs are legally relevant evidence.

Daniel Kroening and the European Roots of Bounded Model Checking

Daniel Kroening ๐Ÿ‡ฉ๐Ÿ‡ช was born in Germany and studied computer science at the University of Stuttgart ๐Ÿ‡ฉ๐Ÿ‡ช before joining the group of Edmund M. Clarke at Carnegie Mellon University in Pittsburgh. Clarke is one of the founding figures of model checking โ€” he shared the ACM Turing Award in 2007 with E. Allen Emerson and Joseph Sifakis ๐Ÿ‡ซ๐Ÿ‡ท (VERIMAG, Grenoble โ€” the French CNRS research institute that also created LUSTRE and SCADE). Kroening completed his PhD at CMU under Clarke's supervision and returned to Europe to join the University of Oxford ๐Ÿ‡ฌ๐Ÿ‡ง, where he built the formal methods group in the Department of Computer Science (now Department of Computer Science, Oxford).

CBMC's original 2004 paper โ€” A Tool for Checking ANSI-C Programs โ€” was published at TACAS (Tools and Algorithms for Construction and Analysis of Systems), the leading European tools conference, organized annually by ETAPS (European Joint Conferences on Theory and Practice of Software). The paper introduced the core idea: encode C program semantics into a bit-vector formula over a bounded execution horizon, submit to a SAT solver, interpret the result. The approach was not new in principle โ€” Bounded Model Checking (BMC) had been formulated by Clarke, Biere, Cimatti, and Zhu in 1999 โ€” but CBMC was the first practical tool to apply BMC to full ANSI-C programs, handling pointer arithmetic, struct layouts, dynamic memory allocation, and the C standard's defined integer semantics.

After Oxford, Kroening co-founded Diffblue โ€” an Oxford University spinout that applies machine learning to automated test generation for Java, with CBMC-derived technology in its formal verification pipeline. Diffblue is headquartered in Oxford ๐Ÿ‡ฌ๐Ÿ‡ง. The CBMC codebase itself is maintained open-source at github.com/diffblue/cbmc under a BSD 4-Clause licence.

The intellectual lineage of CBMC is EU-rooted through Sifakis's VERIMAG group (BMC co-author Armin Biere ๐Ÿ‡ฉ๐Ÿ‡ช๐Ÿ‡ฆ๐Ÿ‡น was at EPFL Lausanne ๐Ÿ‡จ๐Ÿ‡ญ when the foundational BMC paper was written), through the ETAPS conference series (jointly organized by TU Berlin ๐Ÿ‡ฉ๐Ÿ‡ช, INRIA ๐Ÿ‡ซ๐Ÿ‡ท, CWI ๐Ÿ‡ณ๐Ÿ‡ฑ, and KU Leuven ๐Ÿ‡ง๐Ÿ‡ช), and through Kroening's career at Oxford.

How CBMC Works: SAT Encoding of C Programs

CBMC's fundamental operation is symbolic execution with loop unrolling. Given a C function like:

void process_buffer(char *buf, int n) {
    for (int i = 0; i < n; i++) {
        buf[i] = buf[i] + 1;  // CBMC checks: is i always < buf's allocated size?
    }
}

CBMC proceeds in three phases:

Phase 1 โ€” Parsing and IR construction. CBMC parses the C source (handling all GCC extensions, typedef chains, pointer arithmetic, struct bitfields) and constructs an intermediate representation called GOTO-programs. A GOTO-program is a simple, unstructured control-flow graph: assignments, conditionals, goto instructions, function calls, assert statements, and skip instructions.

Phase 2 โ€” Loop unrolling and inlining. CBMC unrolls every loop up to a bound K (specified with --unwind K). A loop unrolled K times becomes K copies of the loop body in straight-line code. After unrolling, CBMC inlines function calls. The result is a single straight-line program that captures all possible executions up to depth K.

Phase 3 โ€” SAT/SMT encoding. CBMC converts the straight-line program into a Boolean formula in conjunctive normal form (CNF) using the technique of Static Single Assignment (SSA). Each program variable at each assignment point becomes a distinct Boolean vector. Pointer arithmetic is encoded using the byte-level memory model: CBMC tracks the entire heap as a flat byte array and encodes pointer operations as array accesses with offset arithmetic. The property to check (e.g., "no buffer overflow") becomes a conjunction of constraints over all array indices. CBMC passes the CNF formula to a SAT solver (MiniSat, CaDiCaL, or an SMT solver like Z3 or Yices in bit-vector mode).

If the solver returns SAT, CBMC decodes the satisfying assignment into a concrete counterexample: a sequence of function calls, parameter values, and memory allocations that trigger the property violation. The counterexample is output as a C trace โ€” a sequence of variable assignments with source line numbers โ€” that can be replayed in a debugger.

If the solver returns UNSAT (and the loop bound is provably sufficient), CBMC reports the property holds for all executions within the bound. When --unwinding-assertions is enabled, CBMC additionally checks that no execution exceeds the unwind bound โ€” if it does, the analysis is not complete, and CBMC reports this explicitly.

Key Verification Properties

By default, CBMC checks:

cbmc program.c \
  --bounds-check        \  # no array out-of-bounds
  --pointer-check       \  # no null/invalid pointer dereference
  --memory-leak-check   \  # no dynamic memory leak
  --div-by-zero-check   \  # no division by zero
  --signed-overflow-check \ # no signed integer overflow (UB)
  --unsigned-overflow-check \ # no unsigned integer wraparound
  --float-overflow-check \ # no floating-point overflow
  --nan-check           \  # no NaN propagation
  --unwind 10              # unroll loops up to 10 times

You can also add your own properties using __CPROVER_assert() (the CBMC built-in assert, equivalent to C assert() but tracked through the SAT encoding) or by calling __CPROVER_assume() to constrain inputs.

Harness-Based Verification

CBMC is particularly effective with verification harnesses โ€” small C programs that call the function under test with non-deterministic inputs:

#include <cbmc/model_assert.h>

int my_function(int x, char *buf, int len);

void harness() {
    int x;
    char *buf;
    int len;
    
    // constrain inputs to valid domain
    __CPROVER_assume(len > 0 && len <= 4096);
    __CPROVER_assume(buf != NULL);
    
    int result = my_function(x, buf, len);
    
    // check postcondition
    __CPROVER_assert(result >= 0, "return value must be non-negative");
}

CBMC treats x, buf, and len as universally quantified โ€” it checks all possible values satisfying the assumes. The harness pattern is exactly what Amazon AWS uses for s2n-tls: each TLS function has a corresponding harness that sets up a non-deterministic TLS state and calls the function, and CBMC verifies that no property violation exists for any valid TLS state.

Industrial Applications: Amazon, Toyota, NASA

Amazon AWS and s2n-tls

Amazon's TLS implementation for AWS services, s2n-tls (Simple Signal to Noise, open source at github.com/aws/s2n-tls), includes a CBMC verification suite as part of its CI/CD pipeline. Every pull request to s2n-tls runs CBMC against a set of harnesses covering the TLS record layer, handshake protocol, session resumption, and cipher suite negotiation. The CI integration runs on GitHub Actions using aws/actions/run_codeowners_tests โ€” CBMC runs as a standard test stage alongside unit tests and integration tests.

The s2n-tls CBMC harnesses have found multiple bugs that were not caught by the test suite:

Each of these bugs, if exploited, could constitute a cryptographic implementation vulnerability affecting AWS services used by European enterprises operating under NIS2 and GDPR. CBMC's machine-checkable evidence that these classes of error cannot occur is directly relevant to EU security certification.

Toyota and ISO 26262

Toyota Motor Corporation ๐Ÿ‡ฏ๐Ÿ‡ต uses CBMC as part of its software development process for embedded automotive C code targeting ISO 26262 ASIL D โ€” the highest automotive safety integrity level, required for safety functions like electronic braking, steering control, and airbag deployment. ISO 26262's Part 6 (software level) lists "formal methods" as a recommended technique at ASIL C and D; CBMC's SAT-based verification satisfies this requirement when applied to the specific code units responsible for safety functions.

European automotive suppliers โ€” Bosch ๐Ÿ‡ฉ๐Ÿ‡ช, Continental ๐Ÿ‡ฉ๐Ÿ‡ช, ZF ๐Ÿ‡ฉ๐Ÿ‡ช, Valeo ๐Ÿ‡ซ๐Ÿ‡ท, Aptiv ๐Ÿ‡ฎ๐Ÿ‡ช โ€” develop AUTOSAR-compliant C code under the same ISO 26262 requirements. CBMC integration into EU automotive software pipelines is a direct path to ASIL D formal evidence without the cost of manual proof.

NASA and Flight Software

NASA Jet Propulsion Laboratory ๐Ÿ‡บ๐Ÿ‡ธ has used CBMC to verify flight software components written in C. The Power of Ten rules for safety-critical C code (Gerard Holzmann ๐Ÿ‡ณ๐Ÿ‡ฑ, NASA JPL โ€” covered in the SPIN blog post) explicitly recommend bounded model checking as a verification technique for rule compliance checking. CBMC checks for all of the Power of Ten violations that are statically verifiable: bounds checking, pointer safety, absence of dynamic memory allocation in the CBMC-verified subset.

SV-COMP: Europe's Formal Verification Championship

CBMC is a consistent top performer at SV-COMP (Competition on Software Verification), the annual competition organized by Dirk Beyer ๐Ÿ‡ฉ๐Ÿ‡ช at LMU Munich ๐Ÿ‡ฉ๐Ÿ‡ช (Ludwig Maximilian University) as part of TACAS/ETAPS. SV-COMP evaluates software verification tools on a benchmark suite of C programs drawn from Linux kernel drivers, automotive control software, heap-manipulating programs, and concurrency benchmarks.

SV-COMP uses a rigorous scoring methodology: tools score points for correct SAFE and UNSAFE verdicts, lose points for incorrect verdicts (unsound results are penalised more heavily than incomplete ones). CBMC has placed in the top tier of the ReachSafety (buffer overflows, assertion violations) and MemSafety (memory safety) categories in multiple years.

Other top SV-COMP competitors are also EU-origin:

The SV-COMP ecosystem demonstrates EU academic leadership in software verification tooling: of the top-performing tools, a majority originate from German and Swiss universities (LMU Munich, University of Freiburg, TU Darmstadt, ETH Zurich).

CBMC in the EU Regulatory Landscape

EU AI Act Article 9 โ€” Risk Management for High-Risk AI Systems

The EU AI Act's Article 9 requires operators of high-risk AI systems (Annex III: biometric identification, critical infrastructure, employment, essential services, law enforcement, migration, administration of justice, democratic processes) to implement a risk management system including testing procedures, correction measures, and safety measures. For AI systems implemented in C โ€” embedded inference engines, automotive neural network accelerators, industrial control system classifiers โ€” CBMC verification of the C runtime provides machine-checkable evidence of:

CBMC's UNSAT certificates constitute formal evidence that an entire class of runtime errors cannot occur โ€” directly satisfying the Art. 9 requirement for technical safety measures.

IEC 61508 โ€” Functional Safety of E/E/PE Systems

IEC 61508 (Functional Safety of Electrical/Electronic/Programmable Electronic Safety-related Systems) is the foundational EU safety standard for industrial control systems, medical devices, process control, and nuclear. Part 3 (software requirements) at SIL 3 and SIL 4 requires formal methods for software verification. CBMC's SAT-based bounded model checking satisfies IEC 61508's formal methods requirement when:

  1. The property specifications correspond to the safety requirements
  2. Loop bounds are demonstrated to be sufficient (via --unwinding-assertions)
  3. Verification is performed at ANSI-C source level before compilation
  4. Results are documented with tool version, command-line flags, and counterexample traces

EU safety-critical system suppliers (Siemens ๐Ÿ‡ฉ๐Ÿ‡ช, ABB ๐Ÿ‡จ๐Ÿ‡ญ๐Ÿ‡ธ๐Ÿ‡ช, Schneider Electric ๐Ÿ‡ซ๐Ÿ‡ท, Pilz ๐Ÿ‡ฉ๐Ÿ‡ช) operate under IEC 61508 for their programmable safety controllers. CBMC integration into their C development toolchains provides objective evidence for SIL 3/4 certification without the cost of manual formal proof.

EU Cyber Resilience Act (CRA) 2027

The Cyber Resilience Act mandates that manufacturers of products with digital elements placed on the EU market demonstrate that products are secure by design and free from known exploitable vulnerabilities. CBMC verification of C code satisfies CRA's technical requirements for:

From 2027, EU market access for embedded C products without formal verification evidence will be significantly more difficult to justify to national market surveillance authorities.

Deploying CBMC on sota.io

CBMC runs as a command-line tool on Linux. The standard deployment on sota.io uses a Dockerfile that installs CBMC from its GitHub releases and runs verification harnesses as part of a CI workflow:

FROM debian:bookworm-slim

# Install CBMC
RUN apt-get update && apt-get install -y \
    wget \
    && CBMC_VERSION=6.4.1 \
    && wget https://github.com/diffblue/cbmc/releases/download/cbmc-${CBMC_VERSION}/ubuntu-22.04-cbmc-${CBMC_VERSION}-Linux.deb \
    && dpkg -i ubuntu-22.04-cbmc-${CBMC_VERSION}-Linux.deb \
    && rm -f ubuntu-22.04-cbmc-${CBMC_VERSION}-Linux.deb \
    && apt-get clean

# Copy source and harnesses
COPY src/ /workspace/src/
COPY harnesses/ /workspace/harnesses/

WORKDIR /workspace

# Run CBMC verification
CMD ["bash", "-c", \
     "for harness in harnesses/*.c; do \
        echo \"Verifying $harness...\"; \
        cbmc src/*.c $harness \
          --bounds-check \
          --pointer-check \
          --memory-leak-check \
          --signed-overflow-check \
          --unsigned-overflow-check \
          --unwind 10 \
          --unwinding-assertions \
          --json-ui > results/$(basename $harness .c).json; \
      done"]

For CI integration in GitHub Actions with EU data residency:

# .github/workflows/cbmc.yml
name: CBMC Formal Verification

on: [push, pull_request]

jobs:
  cbmc:
    runs-on: ubuntu-latest  # or self-hosted runner on sota.io EU server
    steps:
      - uses: actions/checkout@v4
      
      - name: Install CBMC
        run: |
          sudo apt-get install -y cbmc
          cbmc --version
      
      - name: Run CBMC verification
        run: |
          for harness in harnesses/*.c; do
            echo "=== Verifying $(basename $harness) ==="
            cbmc src/*.c "$harness" \
              --bounds-check \
              --pointer-check \
              --memory-leak-check \
              --signed-overflow-check \
              --unwind 20 \
              --unwinding-assertions \
              --stop-on-fail
          done
      
      - name: Upload verification results
        uses: actions/upload-artifact@v4
        with:
          name: cbmc-results
          path: results/

CBMC also integrates with CMake via cmake --preset cbmc if you use the CBMC CMake module, and with Bazel via the cbmc_proof rule.

JBMC: Bounded Model Checking for Java

The Kroening group at Oxford also developed JBMC โ€” CBMC's equivalent for Java bytecode. JBMC takes compiled .class files, converts them to the same GOTO-program IR as CBMC, and applies identical bounded model checking. JBMC is used to verify Java microservices for:

For EU fintech and banking systems โ€” Deutsche Bank ๐Ÿ‡ฉ๐Ÿ‡ช, BNP Paribas ๐Ÿ‡ซ๐Ÿ‡ท, ING ๐Ÿ‡ณ๐Ÿ‡ฑ, Santander ๐Ÿ‡ช๐Ÿ‡ธ โ€” running Java microservices under DORA (Digital Operational Resilience Act, effective January 2025) and NIS2, JBMC provides machine-checkable evidence of runtime safety for critical payment processing paths.

EU Academic Ecosystem

The CBMC ecosystem has spawned significant follow-on research in EU institutions:

CPAchecker โ€” Dirk Beyer ๐Ÿ‡ฉ๐Ÿ‡ช (first at University of Passau ๐Ÿ‡ฉ๐Ÿ‡ช, then SFU Canada, now LMU Munich ๐Ÿ‡ฉ๐Ÿ‡ช). CPAchecker is a configurable software verification framework that uses CBMC's GOTO-program IR as one of several verification backends. CPAchecker introduced Configurable Program Analysis (CPA) โ€” a generic framework for combining verification algorithms (predicate abstraction, explicit-state model checking, symbolic execution, CBMC-style BMC) as pluggable components. CPAchecker consistently wins multiple SV-COMP categories. LMU Munich ๐Ÿ‡ฉ๐Ÿ‡ช (Munich, Bavaria) is a founding member of the Munich Center for Machine Learning (MCML) โ€” the EU's AI excellence hub.

UltimateAutomizer โ€” Matthias Heizmann ๐Ÿ‡ฉ๐Ÿ‡ช + Andreas Podelski ๐Ÿ‡ฉ๐Ÿ‡ช (University of Freiburg ๐Ÿ‡ฉ๐Ÿ‡ช). Automata-based software model checking: synthesises an ฯ‰-automaton (Bรผchi automaton over infinite execution traces) that witnesses the absence of property violations. Freiburg is on the French border; the group collaborates with INRIA Bordeaux ๐Ÿ‡ซ๐Ÿ‡ท.

2LS โ€” Peter Schrammel ๐Ÿ‡ฆ๐Ÿ‡น + Kroening group (University of Sussex ๐Ÿ‡ฌ๐Ÿ‡ง + Oxford ๐Ÿ‡ฌ๐Ÿ‡ง). Interprocedural program analysis using abstract interpretation combined with CBMC's SAT encoding.

ESBMC โ€” Jeremy Morse + Lucas Cordeiro ๐Ÿ‡ง๐Ÿ‡ท๐Ÿ‡ฌ๐Ÿ‡ง (University of Manchester ๐Ÿ‡ฌ๐Ÿ‡ง). ESBMC is a fork of CBMC that adds SMT-based verification (including CVC4, Boolector, MathSAT5 from FBK Trento ๐Ÿ‡ฎ๐Ÿ‡น), parallel verification, and explicit support for embedded C programs under MISRA-C.

The Bounded Model Checking Family Tree

CBMC sits at the centre of the EU bounded model checking ecosystem:

Clarke + Emerson (CMU) โ€” Model Checking (ACM Turing 2007)
    โ†“
Biere ๐Ÿ‡ฆ๐Ÿ‡น + Cimatti ๐Ÿ‡ฎ๐Ÿ‡น + Clarke + Zhu โ€” BMC (CAV 1999)
    โ†“
Kroening ๐Ÿ‡ฉ๐Ÿ‡ช (Oxford ๐Ÿ‡ฌ๐Ÿ‡ง) โ€” CBMC for ANSI-C (TACAS 2004)
    โ”œโ”€โ”€ JBMC โ€” Java bytecode (Oxford 2018)
    โ”œโ”€โ”€ CPAchecker โ€” Dirk Beyer (LMU Munich ๐Ÿ‡ฉ๐Ÿ‡ช, SV-COMP champion)
    โ”œโ”€โ”€ ESBMC โ€” Manchester ๐Ÿ‡ฌ๐Ÿ‡ง (SMT-enhanced CBMC fork)
    โ””โ”€โ”€ 2LS โ€” Oxford + Sussex ๐Ÿ‡ฌ๐Ÿ‡ง (abstract interpretation + BMC)

Armin Biere ๐Ÿ‡ฉ๐Ÿ‡ช๐Ÿ‡ฆ๐Ÿ‡น โ€” co-author of the foundational BMC paper โ€” was at EPFL Lausanne ๐Ÿ‡จ๐Ÿ‡ญ in 1999 (now at University of Freiburg ๐Ÿ‡ฉ๐Ÿ‡ช). Alessandro Cimatti ๐Ÿ‡ฎ๐Ÿ‡น โ€” also a BMC co-author โ€” created NuSMV and nuXmv at FBK Trento ๐Ÿ‡ฎ๐Ÿ‡น (covered in the NuSMV blog post). The entire SAT-based formal verification ecosystem โ€” CBMC, NuSMV, nuXmv, CPAchecker, SV-COMP โ€” has EU institutions and EU researchers at its foundation.

Deploy CBMC on EU Infrastructure Today

CBMC verification workloads generate formal evidence artefacts โ€” JSON results, counterexample traces, UNSAT certificates โ€” that belong on EU infrastructure under EU jurisdiction, particularly when they relate to:

sota.io is the EU-native PaaS where CBMC runs on German infrastructure, under EU jurisdiction, operated by an EU entity. Formal verification evidence stays in the EU.

# Deploy CBMC CI pipeline on sota.io
# 1. Build and push
docker build -t cbmc-verification .
docker push registry.sota.io/your-project/cbmc-verification

# 2. Deploy to sota.io
curl -X POST https://api.sota.io/v1/projects/YOUR_PROJECT_ID/deploy \
  -H "Authorization: Bearer $SOTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"image": "registry.sota.io/your-project/cbmc-verification"}'

The result: CBMC runs on EU servers. Counterexample traces and UNSAT certificates are stored in EU PostgreSQL. Formal verification evidence for ISO 26262, IEC 61508, EU AI Act Article 9, or CRA audits never leaves EU jurisdiction.

CBMC is free software (BSD 4-Clause licence). sota.io has a free tier โ€” sign up, deploy your first CBMC harness in minutes, and generate formal evidence that no fuzzer can match.


See Also


sota.io is built in Europe, for Europe. Every workload you deploy on sota.io stays under EU jurisdiction โ€” GDPR-compliant, Cloud Act-free, and operated by an EU entity. Deploy CBMC now โ†’