Skip to content

Subjects

A subject is a reader-facing compatibility pattern -- what a maintainer would actually search for -- rather than a projection of which detector owns the underlying ChangeKind (see topics, on each case's own meta table). A case may belong to more than one subject when the pattern genuinely applies twice. ← back to all examples

Subject Cases What it is
API design and hygiene anti-patterns 6 The change is technically compatible (or a correctly-labelled risk) but represents a design smell -- namespace pollution, an unnamed type in the public ABI, a polymorphic type with no virtual destructor, a deprecation announcement, or the experimental-API graduation/removal lifecycle.
Build-flag and toolchain-mode drift 12 The same source compiles differently because a build flag, language-mode switch, or standard-library ABI mode flipped between releases -- nothing in the source changed, but the generated code's ABI contract did.
Calling convention and integer-model changes 6 The generated calling convention, parameter-passing model, or a platform's integer/floating-point width for a type changes -- callers and callees stop agreeing on the machine-level contract even though no symbol name changed.
ELF export and linker metadata 10 SONAME, RPATH/RUNPATH, DT_NEEDED, symbol binding, or protected/default visibility metadata changes in the ELF dynamic section -- the loader's view of the library, not its symbol contract.
ELF security hardening and deployment risk 8 A binary-hardening flag, CPU-dispatch capability, or deployment/runtime-environment assumption weakens or shifts between releases -- usually still symbol-compatible, but a real operational risk.
Enum ABI and API changes 6 An enum's member set, value, name, or underlying-type width changes -- some breaks are ABI (value/size), some are source-only (rename).
Export/declaration mismatches 9 A single-release audit (no old/new comparison) finds the binary's export table and its own public headers disagreeing -- an accidental export, a private header leak, an unversioned export, or a declaration with no matching export and vice versa.
Exported variable and data-object changes 6 A global/exported variable's type, qualifiers, size, or TLS model changes -- the same class of change as a function signature break, but for data symbols rather than callable ones.
Function-signature and source-API changes 21 A function or method's parameter types, return type, qualifiers, access level, or overload set changes in a way that is a source-level (recompile-required) break more often than a binary one.
Inheritance layout and base subobjects 4 A base class gains a member, changes position among multiple bases, or loses the empty-base optimization -- the derived class's own subobject layout moves even though the derived class's own members are untouched.
Inline-function and ODR-boundary changes 4 A function moves across the inline/out-of-line boundary, or an inline accessor's body changes what it references -- symbols appear, disappear, or silently reference something else, all without an explicit ABI-breaking declaration.
Public API depends on an internal declaration 15 A public declaration's own contract secretly depends on a private/internal declaration -- reachable only through the L5 source-graph evidence tier, including how the detector reconciles a dependency that was merely renamed or moved rather than truly removed.
Leaked internal types 4 An internal/detail::-namespace type reaches the public ABI by inheritance, by-value embedding, or a shared vtable -- a layout change the author thought was private moves the public class's own size, offsets, or dispatch table.
Modern C/C++ standard-feature hazards 6 A newer C/C++ standard feature (_BitInt, _Atomic, char8_t, [[no_unique_address]], ABI tags, customization-point objects) has its own, less-familiar ABI implications when it changes.
Multi-library bundle topology 5 The break is between libraries in one multi-library release cohort (ADR-023) -- a SONAME skew, an intra-bundle dependency removed, a provider migrated, or a manifest instantiation drift -- not inside any single library's own diff.
Opaque types, typedefs, and contract identifiers 9 A typedef's underlying type, an opaque type's hidden field, a pimpl alias, or a stable numeric/macro identifier (a serialization tag, a public macro or header constant) changes -- the contract was the name staying stable, not any particular layout.
Removed types and classes 5 A whole type, class, or a renamed policy/typedef family is withdrawn from a public API -- coarser-grained than a single function or field removal, usually the retirement of a historical API surface.
Safe changes correctly not flagged 12 A change that looks superficially risky is correctly left un-flagged: an internal/private-header type changed under public-surface scoping, a preprocessor-conditional false positive reconciled, or a genuinely ABI-neutral qualifier change.
Struct and type layout changes 21 A struct, union, or opaque record's own size, field order, offsets, packing, alignment, or bitfield widths change -- the core "does the compiled layout still match" family.
Symbol versioning and kABI 10 A GNU symbol-version node, an inline namespace used for ABI versioning, or a Linux kernel module's kABI CRC/namespace changes -- the mechanisms libraries use to version their own ABI, and what breaks when those mechanisms themselves move.
Symbol visibility scoping 4 A symbol is visible in the binary's export table but was never part of the declared public/header contract -- an ELF-only export whose removal is still a break for whoever found and used it anyway.
Tag-dispatch and empty-class ABI 3 A tag or empty-class type used for compile-time dispatch or as a symbol-mangling landmark gains state, gets renamed, or gets replaced -- its whole ABI role was to be small/stable, so any change to it is disproportionate.
Template and generic-programming issues 7 A class or function template's instantiation set, default arguments, or constraints change in a way visible (or invisible) at the binary or header level -- including a shipped binary missing an instantiation the header still declares.
Textbook symbol add/remove 3 The minimal, no-frills case of an exported function appearing or disappearing -- the baseline every more specific removal/addition pattern in this catalog is a variation on.
Vtable and virtual dispatch changes 13 A change to a class's virtual-method set, order, or inheritance reshapes its vtable, VTT, or dispatch thunks -- silent misdispatch or a crash, not a link error.