a Clang libTooling–based static analysis tool for measuring how often error-returning functions are ignored, partially handled, or handled with future-proof catch-all logic in real-world C and C++ codebases.
Find a file
2026-01-08 22:51:45 -07:00
.clang-format initial commit 2026-01-08 22:51:45 -07:00
.gitignore initial commit 2026-01-08 22:51:45 -07:00
AGENTS.md initial commit 2026-01-08 22:51:45 -07:00
CMakeLists.txt initial commit 2026-01-08 22:51:45 -07:00
LICENSE initial commit 2026-01-08 22:51:45 -07:00
main.cpp initial commit 2026-01-08 22:51:45 -07:00
README.md initial commit 2026-01-08 22:51:45 -07:00

errorck is a Clang libToolingbased static analysis tool for measuring how often error-returning functions are ignored, partially handled, or handled with future-proof catch-all logic in real-world C and C++ codebases.

It is intended for large-scale, empirical analysis across many projects, not as an interactive linter.

Overview

errorck analyzes calls to a fixed set of error-returning functions (hardcoded in the source for now) and classifies how each calls return value is handled. It also detects simple one-layer wrapper functions that forward error codes (e.g. project-specific allocation wrappers) and treats calls through those wrappers equivalently.

The tool emits machine-readable output suitable for ingestion into a database and later statistical analysis.

What errorck detects

For each call to a watched function (or trivial wrapper), errorck classifies the handling into one of the following categories:

ignored
	The return value is discarded and not read.

assigned_not_read
	The return value is assigned to a local variable but never read,
	branched on, or returned.

branched_no_catchall
	The return value is used in an if or switch, but there is no
	else/default branch to handle future error cases.

branched_with_catchall
	The return value is branched on and includes an else or default.

propagated
	The return value is returned directly to the caller.

used_other
	The return value is used in some other way (logging, passed to
	another function, etc.).

For reporting purposes, the following are considered “ignored” error conditions:

  • ignored
  • assigned_not_read
  • branched_no_catchall

Trivial wrapper detection

errorck detects one layer of trivial wrappers around watched functions. A function is considered a trivial wrapper if it:

  • returns a watched function call directly, or
  • assigns the result of a watched function call to a local variable, optionally branches or logs based on that value, and then returns the value unchanged.

Wrappers are reported explicitly, and calls through wrappers are attributed to the underlying base function.

Limitations

errorck deliberately trades completeness for scalability and clarity.

Current limitations include:

  • One-layer wrapper detection only
  • No interprocedural dataflow
  • No function pointer resolution
  • Simplified wrapper body patterns (single return, single result variable)
  • Catch-all detection limited to else/default
  • Analysis is per-translation-unit

These limitations are documented and must be considered when interpreting results.

Building

errorck requires LLVM/Clang with libTooling.

A minimal build using llvm-config:

$ c++ -std=c++17 `errorck`.cpp -o `errorck` \
    `llvm-config --cxxflags --ldflags --system-libs \
     --libs core clangTooling clangFrontend clangAST clangBasic`

Alternatively, a CMake build can be used.

Running

errorck requires a compilation database.

$ `errorck` -p /path/to/build file1.c file2.cpp ...

Output is written to stdout as JSON Lines (one record per line).

Example:

$ `errorck` -p . src/*.c > results.jsonl

Intended use

errorck is designed for:

  • empirical studies of error handling
  • large-scale analysis across many repositories
  • research and auditing, not enforcement

It is not intended to replace compiler warnings or linters.

License

Public domain, Unlicense, 0BSD, or CC0. Whichever you prefer. The 0BSD license is included in the source distribution.