← ESAE / Mattoccia Labs

REAL WORKLOAD · 6 NOVEMBER 2026 · LOCAL ANALYSIS

134,737 unique lines.
85 units completed.

Study context

Problem addressed
How much of a real C/C++ corpus can an isolated analysis workflow cover?
Contribution relative to existing methods
The benchmark reports coverage for both established analyzers on the same corpus and records the execution conditions.
Potential commercial use
Assess the scope of an offline firmware review before a pilot.

Market context and value assumptions on the engine page

ESAE · C/C++

Experiment conclusions

On the Mini M1, Cppcheck and clang-tidy completed all 85 selected translation units, covering 134,737 unique lines, in 11 minutes 30 seconds. With the initial profile, clang-tidy completed 33 within its time budget.

Study limits. The result applies to the tested workload and configuration. Time limits and configuration also changed between profiles, so the timings do not measure a speedup. The scan provides no software certification.

Cppcheck 2.22.0 CLI/core, including its selected vendored dependencies. GUI, tests, add-ons and tools excluded. A serial, checkpointed analysis of the 85 translation units from an actual successful Mac arm64 C++11 build.

134,737unique physical source/header lines
85 / 85units · both native analyzers
11.5 min689.715 seconds measured wall time
540 MiBanalyzer process peak RSS

Largest workload qualified so far in this experiment. This is not a universal maximum, a single standard dashboard job, or a claim of whole-program verification.

What was actually run

ESAE orchestrated Cppcheck 2.22.0 and clang-tidy 23.1.4 locally on a Mac mini M1, 16 GiB, macOS 27, Python 3.12. 186 unique files, 5,315,690 bytes; 85 source translation units and 101 project headers. Shared headers count once. System SDK headers are not included in the line count. All selected source hashes match the pinned upstream archive.

One unit and one native analyzer process at a time; 120 seconds per process, 300 seconds native budget per unit. A selected Mac arm64 C++11 configuration, with verified host predefines and explicitly absent foreign-platform macros. Native checks still run with bounded read-only snapshots, no network and mandatory macOS sandbox. No repository script or compilation command was executed during the benchmark. One selected Cppcheck configuration per compilation database entry; other platform configurations are not covered.

Measurement and repeatability

The full queue took 689.715 seconds, excluding source download, tool installation and unit preparation. Analyzer peak RSS was 565,968,896 bytes; controller peak RSS was 149,798,912 bytes. These are separate process high-water marks, not simultaneous total memory consumption.

85 / 85 units completed, 170 successful analyzer invocations, zero detected execution/configuration errors; original selected sources unchanged. Completion does not prove every code path was analyzed. The full run used the local hardening candidate recorded as 0.1.0. The two slowest units were repeated on final 0.1.1 code, with identical semantic diagnostic signatures. This is not a second full 85-unit run. The public reproduction command was separately stopped after one unit and resumed on the second without replay. 53 regression tests passed, zero failures or skips.

The initial limit remains visible

The initial single-job baseline used 30 seconds per process and a 300-second native budget: it stopped partially after 305.215 seconds, with 33 of 85 clang-tidy units completed and a Cppcheck timeout. The later qualification also corrected target macros and configuration selection; these figures are not a controlled speedup comparison. Godot's million-line repository was previously inventoried but not completely analyzed. No completed million-line result is claimed.

Reproduce locally

Download the ESAE 0.1.1 source, follow its explicit macOS setup, then run:

.venv/bin/python -m benchmarks.reproduce_cppcheck   --output .local/cppcheck-benchmark

Optionally add --max-new-units 5 and rerun the same command to resume. The example verifies the archive and source hashes and rejects changed engine/profile/toolchain checkpoints. It downloads public GPL-3.0-or-later source locally; no third-party source is included in the ESAE source distribution.

Recipe and hash manifest · Official upstream release · Machine-readable results

Explicit boundaries

Source limits remain 1,000 files / 50 MB and 2 MB per file per scan; default single-job native budget remains 300 seconds. The separate example orchestrates bounded scans. No whole-program cross-unit property, WCET, race-freedom, formal correctness or safety certification is verified. Native diagnostics require review and are not a count of confirmed bugs. No AI, cloud or user-code upload was used. Windows/Linux qualification is not implied.

All 85 translation units

#Translation unitAnalyzers completedUnit wall timeErrors
01externals/simplecpp/simplecpp.cpp2 / 219.718 s0
02externals/tinyxml2/tinyxml2.cpp2 / 215.008 s0
03lib/valueflow.cpp2 / 270.982 s0
04lib/tokenize.cpp2 / 232.132 s0
05lib/symboldatabase.cpp2 / 256.417 s0
06lib/addoninfo.cpp2 / 22.442 s0
07lib/analyzerinfo.cpp2 / 25.660 s0
08lib/astutils.cpp2 / 237.368 s0
09lib/check64bit.cpp2 / 22.577 s0
10lib/checkassert.cpp2 / 22.678 s0
11lib/checkautovariables.cpp2 / 24.604 s0
12lib/checkbool.cpp2 / 22.726 s0
13lib/checkbufferoverrun.cpp2 / 23.925 s0
14lib/checkclass.cpp2 / 219.982 s0
15lib/checkcondition.cpp2 / 213.274 s0
16lib/checkers.cpp2 / 20.912 s0
17lib/checkersidmapping.cpp2 / 20.680 s0
18lib/checkersreport.cpp2 / 23.675 s0
19lib/checkexceptionsafety.cpp2 / 22.764 s0
20lib/checkfunctions.cpp2 / 24.971 s0
21lib/checkimpl.cpp2 / 21.225 s0
22lib/checkinternal.cpp2 / 20.385 s0
23lib/checkio.cpp2 / 213.856 s0
24lib/checkleakautovar.cpp2 / 26.905 s0
25lib/checkmemoryleak.cpp2 / 28.005 s0
26lib/checknullpointer.cpp2 / 24.673 s0
27lib/checkother.cpp2 / 218.483 s0
28lib/checkpostfixoperator.cpp2 / 22.552 s0
29lib/checks.cpp2 / 22.352 s0
30lib/checksizeof.cpp2 / 24.380 s0
31lib/checkstl.cpp2 / 217.271 s0
32lib/checkstring.cpp2 / 23.442 s0
33lib/checktype.cpp2 / 24.847 s0
34lib/checkuninitvar.cpp2 / 29.068 s0
35lib/checkunusedfunctions.cpp2 / 27.141 s0
36lib/checkunusedvar.cpp2 / 28.981 s0
37lib/checkvaarg.cpp2 / 22.766 s0
38lib/clangimport.cpp2 / 28.089 s0
39lib/color.cpp2 / 21.251 s0
40lib/cppcheck.cpp2 / 29.028 s0
41lib/ctu.cpp2 / 29.629 s0
42lib/errorlogger.cpp2 / 28.994 s0
43lib/errortypes.cpp2 / 20.793 s0
44lib/findtoken.cpp2 / 24.059 s0
45lib/forwardanalyzer.cpp2 / 25.273 s0
46lib/fwdanalysis.cpp2 / 24.973 s0
47lib/importproject.cpp2 / 214.400 s0
48lib/infer.cpp2 / 25.301 s0
49lib/keywords.cpp2 / 20.797 s0
50lib/library.cpp2 / 211.752 s0
51lib/mathlib.cpp2 / 24.521 s0
52lib/path.cpp2 / 21.593 s0
53lib/pathanalysis.cpp2 / 22.933 s0
54lib/pathmatch.cpp2 / 22.035 s0
55lib/platform.cpp2 / 23.447 s0
56lib/preprocessor.cpp2 / 212.072 s0
57lib/programmemory.cpp2 / 211.247 s0
58lib/regex.cpp2 / 20.329 s0
59lib/reverseanalyzer.cpp2 / 22.919 s0
60lib/sarifreport.cpp2 / 23.057 s0
61lib/settings.cpp2 / 24.842 s0
62lib/standards.cpp2 / 20.939 s0
63lib/summaries.cpp2 / 24.481 s0
64lib/suppressions.cpp2 / 212.784 s0
65lib/templatesimplifier.cpp2 / 220.189 s0
66lib/timer.cpp2 / 22.391 s0
67lib/token.cpp2 / 221.119 s0
68lib/tokenlist.cpp2 / 214.374 s0
69lib/utils.cpp2 / 21.550 s0
70lib/vf_analyzers.cpp2 / 212.006 s0
71lib/vf_common.cpp2 / 23.902 s0
72lib/vf_settokenvalue.cpp2 / 23.087 s0
73lib/vfvalue.cpp2 / 22.527 s0
74frontend/frontend.cpp2 / 21.054 s0
75cli/cmdlineparser.cpp2 / 217.411 s0
76cli/cppcheckexecutor.cpp2 / 24.400 s0
77cli/executor.cpp2 / 21.887 s0
78cli/filelister.cpp2 / 22.683 s0
79cli/main.cpp2 / 20.846 s0
80cli/processexecutor.cpp2 / 23.289 s0
81cli/sehwrapper.cpp2 / 20.324 s0
82cli/signalhandler.cpp2 / 20.858 s0
83cli/singleexecutor.cpp2 / 21.045 s0
84cli/stacktrace.cpp2 / 20.988 s0
85cli/threadexecutor.cpp2 / 23.221 s0