Skip to content

case147 — Depth ladder: the same input answered at three depths

Field Value
Verdict 🟡 COMPATIBLE_WITH_RISK
Category Risk
Platforms Linux
Flags Bad practice
Detected ChangeKinds
Source files examples/case147_scan_depth_ladder/

Verdict: 🟡 COMPATIBLE_WITH_RISK · Cross-check: private_header_leak · Mode: single-release audit · Evidence tier: L2 (→ L5 corroboration)

What it demonstrates

The legibility anchor for ADR-035's honest-coverage promise: identical input scanned at increasing depth, with the report stating exactly what each depth proved and what it could not — never a bare "scan failed".

connect() takes detail::SessionState&, a private-header type.

Depth Method What it proves What it cannot
S3 lexical pattern pre-scan (no compiler) flags a risky construct: a public signature mentions a detail:: name cannot confirm the type is actually private — only a textual hint
S2 preprocessor (if a compile DB is present) resolves the #include graph does not parse the AST
S5 source replay + L5 source graph confirms detail::SessionState originates in a private header and is reached from a public decl → PRIVATE_HEADER_LEAK, corroborated by the source_index provider (the deepest answer)

The committed snapshot.abi.json carries the L2 header provenance and the L5 source graph, so the cross-check fires with the source_index corroboration the S5 pass would add — the endpoint of the ladder.

Reproduce the ladder

abicheck scan --binary libdemo.so -H include/ --audit --source-method s3   # pattern only
abicheck scan --binary libdemo.so -H include/ --audit --sources . --source-method s5  # S5 replay + graph

Fix

Same as a private-header leak: opaque-handle the type, or install its header.


Source files

  • snapshot.abi.json

See also: Examples overview · All COMPATIBLE_WITH_RISK cases · Category: Risk.