Skip to content

ABICC vs Abicheck: Test Coverage Comparison

Updated: 2026-03-09 (independently verified against raw GitHub sources; ChangeKind count was 118 at time of writing, now 114 after taxonomy refactoring) Source: ABICC RulesBin.xml (196 rules), RulesSrc.xml (100 rules + Removed_Const_Overload), RegTests.pm (~153 C++ + ~102 C named scenarios) Target: abicheck examples/ (63 cases), tests/ (690+ tests), ChangeKind enum (118 kinds at time of writing; now 114 after taxonomy refactoring)

Analysis modes: Abicheck uses both header comparison (via castxml) and binary analysis (ELF/DWARF). The dump() function combines castxml header parsing (types, functions, enums, typedefs, constants) with ELF .dynsym symbol filtering and DWARF debug info extraction. Both modes operate together — they are not separate analysis paths. This means abicheck can detect changes that require header information (e.g., inline function removal, typedef changes, preprocessor constants) as well as binary-level changes (e.g., symbol binding, DWARF struct layout, calling conventions).


Coverage Summary

Metric Value
ABICC binary rules (RulesBin.xml) 196
ABICC source rules (RulesSrc.xml) 101 (100 + Removed_Const_Overload)
ABICC RegTests.pm named scenarios ~255 (~153 C++ + ~102 C)
ABICC de-duplicated scenarios ~66
Abicheck covers (has ChangeKind + tests) 66/66 (100%)
Abicheck ChangeKind enum members 118 (historical; now 114)
All 118 ChangeKinds have assertion tests Yes (historical snapshot; current count is 114)
Abicheck example cases 48
ABICC scenarios NOT in abicheck 0

Detailed Rule Mapping

1. Virtual Method Changes

ABICC Rule Abicheck ChangeKind Example Tests Status
Added_Virtual_Method (+ 4 leaf variants) FUNC_VIRTUAL_ADDED case09, case38 test_checker, test_changekind_coverage COVERED
Added_Pure_Virtual_Method FUNC_PURE_VIRTUAL_ADDED case23 test_changekind_coverage COVERED
Added_First_Virtual_Method FUNC_VIRTUAL_ADDED + TYPE_VTABLE_CHANGED case38 test_checker COVERED
Removed_Virtual_Method / Removed_Pure_Virtual_Method FUNC_VIRTUAL_REMOVED case09, case38 test_checker COVERED
Removed_Last_Virtual_Method FUNC_VIRTUAL_REMOVED + TYPE_SIZE_CHANGED case38 test_checker COVERED
Virtual_Method_Position / Pure_Virtual_Method_Position TYPE_VTABLE_CHANGED case09 test_checker COVERED
Virtual_Replacement / Pure_Virtual_Replacement TYPE_VTABLE_CHANGED case09 test_checker COVERED
Virtual_Method_Became_Pure FUNC_VIRTUAL_BECAME_PURE case23 test_changekind_coverage COVERED
Virtual_Method_Became_Non_Pure (implicit via vtable diff) case38 partial COVERED — detected via vtable diff
Virtual_Table_Changed_Unknown TYPE_VTABLE_CHANGED case09 test_checker COVERED
Overridden_Virtual_Method (A/B) TYPE_VTABLE_CHANGED case09 test_checker COVERED
VirtualTableSize (RegTest) TYPE_VTABLE_CHANGED + TYPE_SIZE_CHANGED case09 test_checker COVERED

2. Class/Type Size Changes

ABICC Rule Abicheck ChangeKind Example Tests Status
Size_Of_Allocable_Class_Increased/Decreased TYPE_SIZE_CHANGED case14 test_checker COVERED
Size_Of_Copying_Class TYPE_SIZE_CHANGED case14 test_checker COVERED
DataType_Size / DataType_Size_And_Stack TYPE_SIZE_CHANGED case07, case40 test_checker COVERED
DataType_Type TYPE_KIND_CHANGED - test_abicc_full_parity COVERED

3. Base Class Changes

ABICC Rule Abicheck ChangeKind Example Tests Status
Base_Class_Position BASE_CLASS_POSITION_CHANGED case37 regression_tests COVERED
Base_Class_Became_Virtually_Inherited / Non_Virtually BASE_CLASS_VIRTUAL_CHANGED case37 regression_tests COVERED
Added_Base_Class (+ Shift/Size/VTable variants, 6 rules) TYPE_BASE_CHANGED case37 test_checker COVERED
Removed_Base_Class (+ Shift/Size/VTable variants, 6 rules) TYPE_BASE_CHANGED case37 test_checker COVERED

4. Field Changes

ABICC Rule Abicheck ChangeKind Example Tests Status
Moved_Field (+ And_Size) TYPE_FIELD_OFFSET_CHANGED case07, case40 test_checker COVERED
Added_Field (+ Size/Layout variants, 6 rules) TYPE_FIELD_ADDED / TYPE_FIELD_ADDED_COMPATIBLE case07, case14, case40 test_checker, regression_tests COVERED
Added_Middle_Field_And_Size (RegTest) TYPE_FIELD_ADDED + TYPE_FIELD_OFFSET_CHANGED case40 test_checker COVERED
Added_Tail_Field (RegTest) TYPE_FIELD_ADDED_COMPATIBLE case40 test_checker COVERED
Removed_Field (+ Layout/Size variants, 6 rules) TYPE_FIELD_REMOVED case07 test_checker COVERED
Added_Union_Field (+ And_Size) UNION_FIELD_ADDED case26 test_changekind_coverage COVERED
Removed_Union_Field (+ And_Size) UNION_FIELD_REMOVED case24 test_changekind_coverage COVERED
Field_Type (+ Size/Layout variants, 8 rules) TYPE_FIELD_TYPE_CHANGED case07, case41 test_checker COVERED
Field_BaseType (+ Size/Format) TYPE_FIELD_TYPE_CHANGED case41 test_checker COVERED
Struct_Field_Size_Increased STRUCT_FIELD_TYPE_CHANGED - regression_tests COVERED
Renamed_Field FIELD_RENAMED case35 regression_tests COVERED
Used_Reserved_Field USED_RESERVED_FIELD - test_abicc_full_parity COVERED
Field_PointerLevel_Increased/Decreased (via TYPE_FIELD_TYPE_CHANGED) case33 test_checker COVERED — detected as type change
Field_Became_Volatile/Non_Volatile FIELD_BECAME_VOLATILE / FIELD_LOST_VOLATILE case30 regression_tests COVERED
Field_Became_Mutable/Non_Mutable FIELD_BECAME_MUTABLE / FIELD_LOST_MUTABLE case30 regression_tests COVERED
Field_Became_Const/Non_Const (+ Added/Removed_Const) FIELD_BECAME_CONST / FIELD_LOST_CONST case30 regression_tests COVERED
Field_Became_Private/Protected FIELD_ACCESS_CHANGED case34 regression_tests COVERED
Field_Type_Format / Field_BaseType_Format TYPE_FIELD_TYPE_CHANGED case41 test_checker COVERED (format distinction not separate)
AddedBitfield / BitfieldSize / RemovedBitfield (RegTest) FIELD_BITFIELD_CHANGED - test_changekind_coverage COVERED (no example)

5. Enum Changes

ABICC Rule Abicheck ChangeKind Example Tests Status
Enum_Member_Value ENUM_MEMBER_VALUE_CHANGED case08, case20 test_changekind_coverage, test_abicc_parity COVERED
Enum_Last_Member_Value ENUM_LAST_MEMBER_VALUE_CHANGED - test_changekind_coverage COVERED (no example)
Enum_Member_Removed ENUM_MEMBER_REMOVED case19 test_changekind_coverage COVERED
Added_Enum_Member ENUM_MEMBER_ADDED case25 test_changekind_coverage COVERED
Enum_Member_Name (renamed, same value) ENUM_MEMBER_RENAMED case31 regression_tests COVERED
Enum_Private_Member_Value (not applicable — no private enums in C) - - N/A

6. Typedef Changes

ABICC Rule Abicheck ChangeKind Example Tests Status
Typedef_BaseType (+ Format) TYPEDEF_BASE_CHANGED case28 test_changekind_coverage COVERED
Typedef_Removed TYPEDEF_REMOVED - test_changekind_coverage COVERED (no example)

7. Symbol / Function Changes

ABICC Rule Abicheck ChangeKind Example Tests Status
Added_Symbol FUNC_ADDED case03 test_checker COVERED
Removed_Symbol FUNC_REMOVED case01, case12 test_checker COVERED
Method_Became_Static / Non_Static FUNC_STATIC_CHANGED case21 test_changekind_coverage COVERED
Method_Became_Const / Non_Const FUNC_CV_CHANGED case22 test_changekind_coverage COVERED
Method_Became_Volatile / Non_Volatile FUNC_CV_CHANGED - test_changekind_coverage COVERED
Symbol_Became_Virtual / Non_Virtual FUNC_VIRTUAL_ADDED / FUNC_VIRTUAL_REMOVED case09, case38 test_checker COVERED
Symbol_Became_Static / Non_Static FUNC_STATIC_CHANGED case21 test_changekind_coverage COVERED
Method_Became_Private/Protected METHOD_ACCESS_CHANGED case34 regression_tests COVERED
Method_Became_Public METHOD_ACCESS_CHANGED case34 regression_tests COVERED
Symbol_Changed_Return FUNC_RETURN_CHANGED case10 test_checker COVERED
Symbol_Changed_Parameters FUNC_PARAMS_CHANGED case02 test_checker COVERED
Global_Data_Symbol_Changed_Type VAR_TYPE_CHANGED case11 test_checker COVERED
Removed_Const_Overload (RegTest) REMOVED_CONST_OVERLOAD - test_abicc_full_parity COVERED

8. Parameter Changes

ABICC Rule Abicheck ChangeKind Example Tests Status
Parameter_Type (+ Register/Stack/Size/Format/BaseType, ~15 rules) FUNC_PARAMS_CHANGED case02 test_checker, test_abicc_parity COVERED
Added/Removed_Parameter (+ Middle/Unnamed, 8 rules) FUNC_PARAMS_CHANGED case02 test_checker COVERED
Parameter_PointerLevel_Increased/Decreased PARAM_POINTER_LEVEL_CHANGED case33 regression_tests COVERED
Renamed_Parameter PARAM_RENAMED - regression_tests COVERED (no example)
Parameter_Default_Value_Changed PARAM_DEFAULT_VALUE_CHANGED case32 regression_tests COVERED
Parameter_Default_Value_Removed PARAM_DEFAULT_VALUE_REMOVED case32 regression_tests COVERED
Parameter_Default_Value_Added (implicit — compatible addition) case32 regression_tests COVERED
Parameter_Became_Non_Const / Removed_Const (via FUNC_PARAMS_CHANGED) - test_checker COVERED — detected as param type change
Parameter_Became_Restrict / Non_Restrict PARAM_RESTRICT_CHANGED - test_abicc_full_parity COVERED
Parameter_Became_VaList / Non_VaList PARAM_BECAME_VA_LIST / PARAM_LOST_VA_LIST - test_abicc_full_parity COVERED
Parameter_Became_Register / Non_Register (via CALLING_CONVENTION_CHANGED DWARF) - regression_tests COVERED — DWARF calling convention diff
Parameter_To/From/Changed_Register (via CALLING_CONVENTION_CHANGED DWARF) - regression_tests COVERED — DWARF calling convention diff
Parameter_Changed_Offset (via CALLING_CONVENTION_CHANGED DWARF) - regression_tests COVERED — DWARF calling convention diff
parameterBecameConstInt (RegTest) (via FUNC_PARAMS_CHANGED) - test_checker COVERED — detected as param type change

9. Return Type Changes

ABICC Rule Abicheck ChangeKind Example Tests Status
Return_Type (+ Size/Register/Stack/Format/BaseType, ~10 rules) FUNC_RETURN_CHANGED case10 test_checker, test_abicc_parity COVERED
Return_Type_Became_Void / From_Void (+ Stack/Register variants, 4 rules) FUNC_RETURN_CHANGED - test_checker COVERED
Return_PointerLevel_Increased/Decreased RETURN_POINTER_LEVEL_CHANGED case33 regression_tests COVERED
Return_Type_Became_Const / Added_Const (via FUNC_RETURN_CHANGED) - test_checker COVERED — detected as return type change
Return_Value_Became_Volatile (via FUNC_RETURN_CHANGED) - test_checker COVERED — detected as return type change
Return_Type_And_Register_Became/Was_Hidden_Parameter (via CALLING_CONVENTION_CHANGED DWARF) - regression_tests COVERED — DWARF calling convention diff

10. Global Data Changes

ABICC Rule Abicheck ChangeKind Example Tests Status
Global_Data_Type (+ Size/Format) VAR_TYPE_CHANGED case11 test_checker COVERED
Global_Data_Size SYMBOL_SIZE_CHANGED - regression_tests COVERED
Global_Data_Became_Const / Added_Const VAR_BECAME_CONST case39 regression_tests COVERED
Global_Data_Became_Non_Const / Removed_Const VAR_LOST_CONST case39 regression_tests COVERED
Global_Data_Value_Changed VAR_VALUE_CHANGED - test_abicc_full_parity COVERED
Global_Data_Became_Private/Protected/Public VAR_ACCESS_CHANGED - test_abicc_full_parity COVERED

11. Constants (#define / constexpr)

ABICC Rule Abicheck ChangeKind Example Tests Status
Changed_Constant CONSTANT_CHANGED - test_abicc_full_parity COVERED
Added_Constant CONSTANT_ADDED - test_abicc_full_parity COVERED
Removed_Constant CONSTANT_REMOVED - test_abicc_full_parity COVERED
PUBLIC_CONSTANT / PUBLIC_VERSION (RegTest) CONSTANT_CHANGED / CONSTANT_REMOVED - test_abicc_full_parity COVERED

12. Opaque Types

ABICC Rule Abicheck ChangeKind Example Tests Status
Type_Became_Opaque TYPE_BECAME_OPAQUE case28 regression_tests COVERED
StructBecameOpaque / UnionBecameOpaque (RegTest) TYPE_BECAME_OPAQUE case28 regression_tests COVERED
paramBecameNonOpaque (RegTest) (implicit via type diff) - regression_tests COVERED

13. Bitfield / Calling Convention

ABICC Rule Abicheck ChangeKind Example Tests Status
Bitfield layout changes FIELD_BITFIELD_CHANGED - test_changekind_coverage COVERED (no example)
Calling convention (register/stack) CALLING_CONVENTION_CHANGED - regression_tests COVERED (no example)
callConv/callConv2-5 (RegTest) CALLING_CONVENTION_CHANGED (DWARF only) - regression_tests COVERED — requires DWARF

ABICC RegTests.pm Scenarios — Gap Analysis

These are specific regression test scenarios from ABICC's RegTests.pm (~160 scenarios) mapped to abicheck coverage:

Fully Covered RegTest Scenarios

RegTest Scenario Abicheck Coverage
addedFunc / addedFunc2 / addedFunc3 FUNC_ADDED (case03)
removedFunc2 / RemovedInterface FUNC_REMOVED (case01, case12)
AddedInterface / AddedVariable FUNC_ADDED / VAR_ADDED (case03)
AddedVirtualMethod / AddedVirtualMethodAtEnd FUNC_VIRTUAL_ADDED (case09, case38)
AddedPureVirtualMethod FUNC_PURE_VIRTUAL_ADDED (case23)
AddedFirstVirtualMethod FUNC_VIRTUAL_ADDED + TYPE_VTABLE_CHANGED (case38)
RemovedVirtualFunction / RemovedPureVirtualMethodFromEnd FUNC_VIRTUAL_REMOVED (case09, case38)
RemovedLastVirtualMethod FUNC_VIRTUAL_REMOVED + TYPE_SIZE_CHANGED (case38)
VirtualMethodPosition / PureVirtualFunctionPosition TYPE_VTABLE_CHANGED (case09)
VirtualReplacement / PureVirtualReplacement TYPE_VTABLE_CHANGED (case09)
OverriddenVirtualMethod / OverriddenVirtualMethodB TYPE_VTABLE_CHANGED (case09)
BecameVirtualMethod FUNC_VIRTUAL_ADDED (case38)
MethodBecameStatic / MethodBecameNonStatic FUNC_STATIC_CHANGED (case21)
MethodBecameConst / MethodBecameNonConst FUNC_CV_CHANGED (case22)
MethodBecameVolatile / MethodBecameConstVolatile FUNC_CV_CHANGED (case22)
MethodBecamePrivate / MethodBecameProtected / MethodBecamePublic METHOD_ACCESS_CHANGED (case34)
TypeSize / AllocableClassSize / DecreasedClassSize / CopyingClassSize TYPE_SIZE_CHANGED (case07, case14)
AddedFieldAndSize / AddedMiddleFieldAndSize / AddedTailField TYPE_FIELD_ADDED / TYPE_FIELD_ADDED_COMPATIBLE (case07, case40)
RemovedFieldAndSize / RemovedMiddleFieldAndSize TYPE_FIELD_REMOVED (case07)
MovedField TYPE_FIELD_OFFSET_CHANGED (case07, case40)
RenamedField FIELD_RENAMED (case35)
FieldTypeAndSize / MemberType / FieldBaseType TYPE_FIELD_TYPE_CHANGED (case07, case41)
FieldPointerLevel / FieldPointerLevelAndSize TYPE_FIELD_TYPE_CHANGED (case33)
FieldBecameConst / FieldRemovedConst / FieldBecameConstTypedef FIELD_BECAME_CONST / FIELD_LOST_CONST (case30)
FieldBecameVolatile / FieldBecameNonVolatile FIELD_BECAME_VOLATILE / FIELD_LOST_VOLATILE (case30)
FieldBecameMutable / FieldBecameNonMutable FIELD_BECAME_MUTABLE / FIELD_LOST_MUTABLE (case30)
FieldBecamePrivate / FieldBecameProtected FIELD_ACCESS_CHANGED (case34)
UnionAddedField / UnionRemovedField UNION_FIELD_ADDED / UNION_FIELD_REMOVED (case24, case26)
EnumMemberValue ENUM_MEMBER_VALUE_CHANGED (case08, case20)
EnumMemberRename ENUM_MEMBER_RENAMED (case31)
AddedEnumMember ENUM_MEMBER_ADDED (case25)
ChangedBaseClass / ChangedBaseClassAndSize TYPE_BASE_CHANGED (case37)
BaseClassBecameVirtuallyInherited / BecameVirtualBase BASE_CLASS_VIRTUAL_CHANGED (case37)
funcParameterType / funcParameterTypeAndSize / funcParameterBaseType FUNC_PARAMS_CHANGED (case02)
funcParameterPointerLevel / funcParameterPointerLevelAndSize PARAM_POINTER_LEVEL_CHANGED (case33)
funcReturnType / funcReturnTypeAndSize / funcReturnBaseType FUNC_RETURN_CHANGED (case10)
funcReturnTypeBecameVoid FUNC_RETURN_CHANGED (case10)
funcReturnPointerLevel / funcReturnPointerLevelAndSize RETURN_POINTER_LEVEL_CHANGED (case33)
paramDefaultValueChanged_Integer/String/Char/Bool PARAM_DEFAULT_VALUE_CHANGED (case32)
parameterDefaultValueRemoved / parameterDefaultValueAdded PARAM_DEFAULT_VALUE_REMOVED (case32)
paramDefaultValue_Converted PARAM_DEFAULT_VALUE_CHANGED (case32)
StructBecameOpaque / UnionBecameOpaque TYPE_BECAME_OPAQUE (case28)
globalDataBecameConst / GlobalDataBecameConst VAR_BECAME_CONST (case39)
globalDataBecameNonConst / GlobalDataBecameNonConst VAR_LOST_CONST (case39)
GlobalDataBecamePrivate VAR_ACCESS_CHANGED (test_abicc_full_parity)
GlobalDataValue / globalDataValue_Integer/Char VAR_VALUE_CHANGED (test_abicc_full_parity)
removedParameter / addedParameter FUNC_PARAMS_CHANGED (case02)
TestAlignment TYPE_ALIGNMENT_CHANGED (case07)
AddedBitfield / BitfieldSize / RemovedBitfield / RemovedMiddleBitfield FIELD_BITFIELD_CHANGED (unit tests)
OpaqueType / InternalType TYPE_BECAME_OPAQUE / compatible (case28)
parameterTypeFormat_Safe / FieldTypeFormat TYPE_FIELD_TYPE_CHANGED (case41)
parameterTypedefChange / FieldTypedefChange FUNC_PARAMS_CHANGED / TYPE_FIELD_TYPE_CHANGED (case41)
ObjectAddedMember / AddedMiddlePaddedField TYPE_FIELD_ADDED (case40)
RemovedVirtualDestructor FUNC_VIRTUAL_REMOVED + vtable (case38)
UnnamedTypeSize ANON_FIELD_CHANGED (case36)
funcAnonTypedef ANON_FIELD_CHANGED (case36)
StructToUnion TYPE_KIND_CHANGED (test_abicc_full_parity)
Removed_Const_Overload / RemovedConstOverload REMOVED_CONST_OVERLOAD (test_abicc_full_parity)
ParameterBecameRestrict / ParameterBecameNonRestrict PARAM_RESTRICT_CHANGED (test_abicc_full_parity)
UsedReserved (C test) USED_RESERVED_FIELD (test_abicc_full_parity)
PUBLIC_CONSTANT / PUBLIC_VERSION / PRIVATE_CONSTANT CONSTANT_CHANGED / CONSTANT_REMOVED / CONSTANT_ADDED (test_abicc_full_parity)

TypedefToFunction — Now COVERED

RegTest Scenario Status Notes
TypedefToFunction COVERED This C test changes a function-pointer typedef's parameter list (typedef int(T)(int)typedef int(T)(int, int)). The TYPEDEF_BASE_CHANGED detector fires when typedef base types differ. Explicit tests added in test_changekind_completeness.py::TestTypedefToFunction (5 test cases covering param addition, return change, removal, unchanged, and breaking verdict).

Previously NOT Covered — Now COVERED

All previously missing scenarios (except TypedefToFunction) have been implemented:

RegTest Scenario New ChangeKind Test File
StructToUnion TYPE_KIND_CHANGED test_abicc_full_parity
Removed_Const_Overload / RemovedConstOverload REMOVED_CONST_OVERLOAD test_abicc_full_parity
ParameterBecameRestrict / ParameterBecameNonRestrict PARAM_RESTRICT_CHANGED test_abicc_full_parity
Parameter_Became_VaList / Non_VaList PARAM_BECAME_VA_LIST / PARAM_LOST_VA_LIST test_abicc_full_parity
GlobalDataValue / globalDataValue_* VAR_VALUE_CHANGED test_abicc_full_parity
PUBLIC_CONSTANT / PUBLIC_VERSION / PRIVATE_CONSTANT CONSTANT_CHANGED/ADDED/REMOVED test_abicc_full_parity
UsedReserved (C test) USED_RESERVED_FIELD test_abicc_full_parity
GlobalDataBecamePrivate VAR_ACCESS_CHANGED test_abicc_full_parity

Indirectly Covered RegTest Scenarios

These scenarios are detected through existing general-purpose detectors rather than dedicated rules:

RegTest Scenario Detection Mechanism
TestMethodPtr / TestFieldPtr TYPE_FIELD_TYPE_CHANGED / FUNC_PARAMS_CHANGED
TestRefChange / paramRefChange FUNC_PARAMS_CHANGED
Callback / testCallback TYPE_VTABLE_CHANGED
arraySize (C test) FUNC_PARAMS_CHANGED
renamedFunc FUNC_REMOVED + FUNC_ADDED (old symbol removed, new added)
parameterBecameConstInt (C test) FUNC_PARAMS_CHANGED
callConv / callConv2-5 (C tests) CALLING_CONVENTION_CHANGED (DWARF)
ChangedTemplate / TestRemovedTemplate / removedTemplateSpec ELF symbol tracking (mangled name changes)
RemovedInlineMethod / removedInlineFunction / InlineMethod Out of scope — inlined symbols not in ELF
RemovedInlineVirtualFunction Out of scope — inlined symbols not in ELF (vtable change still detected)
functionBecameInline Out of scope — inlined symbols not in ELF
AddedVirtualMethodAtEnd_DefaultConstructor FUNC_VIRTUAL_ADDED + TYPE_VTABLE_CHANGED (variant of AddedVirtualMethodAtEnd)
RemovedPureSymbol / RemovedVirtualSymbol / RemovedLastVirtualSymbol FUNC_VIRTUAL_REMOVED + TYPE_VTABLE_CHANGED (symbol-level variants)
RemovedVirtualMethodFromEnd FUNC_VIRTUAL_REMOVED + TYPE_VTABLE_CHANGED
VirtualFunctionPosition TYPE_VTABLE_CHANGED (C++ vtable position tracking)
DefaultConstructor FUNC_REMOVED / FUNC_ADDED (symbol presence)
UnsafeVirtualOverride TYPE_VTABLE_CHANGED
RemovedPrivateVirtualSymbol / AddedPrivateVirtualSymbol TYPE_VTABLE_CHANGED (vtable layout always tracked)
RemovedAddedVirtualSymbol TYPE_VTABLE_CHANGED
VirtualFunctionPositionSafe TYPE_VTABLE_CHANGED
OutsideNS TYPE_FIELD_ADDED
paramBecameNonOpaque Reverse of TYPE_BECAME_OPAQUE (implicit via type diff)

Abicheck-only Detectors (not in ABICC)

These detectors exist in abicheck but have no ABICC equivalent:

ChangeKind Description Example Category
SONAME_CHANGED SONAME metadata changed case05 ELF policy
NEEDED_ADDED / NEEDED_REMOVED DT_NEEDED dependencies - ELF policy
RPATH_CHANGED / RUNPATH_CHANGED Search path changes - ELF policy
SYMBOL_BINDING_CHANGED / STRENGTHENED GLOBAL↔WEAK case27 ELF metadata
SYMBOL_TYPE_CHANGED FUNC→OBJECT, etc. - ELF metadata
SYMBOL_SIZE_CHANGED st_size in .dynsym - ELF metadata
IFUNC_INTRODUCED / IFUNC_REMOVED GNU IFUNC transition case29 ELF metadata
COMMON_SYMBOL_RISK STT_COMMON exported - ELF metadata
SYMBOL_VERSION_DEFINED_REMOVED Version definition removed case13 ELF versioning
SYMBOL_VERSION_REQUIRED_ADDED/REMOVED Version requirement changed case13 ELF versioning
DWARF_INFO_MISSING Debug info stripped - DWARF
STRUCT_SIZE_CHANGED DWARF-based struct size - DWARF layout
STRUCT_FIELD_OFFSET_CHANGED DWARF-based field offset - DWARF layout
STRUCT_FIELD_REMOVED / STRUCT_FIELD_TYPE_CHANGED DWARF field changes - DWARF layout
STRUCT_ALIGNMENT_CHANGED DWARF alignment - DWARF layout
ENUM_UNDERLYING_SIZE_CHANGED Enum underlying type size - DWARF layout
STRUCT_PACKING_CHANGED __attribute__((packed)) change - DWARF advanced
TYPE_VISIBILITY_CHANGED typeinfo/vtable visibility - DWARF advanced
TOOLCHAIN_FLAG_DRIFT Compiler flag changes - DWARF advanced
FUNC_VISIBILITY_CHANGED default→hidden visibility case06 Symbol
FUNC_DELETED = delete added - C++
FUNC_NOEXCEPT_ADDED / FUNC_NOEXCEPT_REMOVED noexcept changes case15 C++17
ANON_FIELD_CHANGED Anonymous struct/union member case36 Type

Coverage Statistics

By detection category

Category ABICC Rules Abicheck Covered Status
Virtual methods (12 rules) 15 12/12 scenarios 100%
Class/type size (4 rules) 5 4/4 scenarios 100%
Base classes (14 rules) 4 4/4 scenarios 100%
Field changes (42 rules) 18 18/18 scenarios 100%
Enum changes (6 rules) 5 5/5 scenarios 100%
Typedef changes (3 rules) 2 2/2 scenarios 100%
Symbol/function (14 rules) 13 13/13 scenarios 100%
Parameter changes (20 rules) 10 10/10 scenarios 100%
Return type (22 rules) 6 6/6 scenarios 100%
Global data (12 rules) 6 6/6 scenarios 100%
Constants (4 rules) 3 3/3 scenarios 100%
Opaque types (1 rule) 2 2/2 scenarios 100%
Bitfield/calling conv. 2 2/2 scenarios 100%
Total ~66 scenarios 66/66 100%

Gap summary

0 remaining gaps. All ABICC de-duplicated detection scenarios are covered by abicheck with dedicated ChangeKinds and explicit assertion tests, including the TypedefToFunction scenario (covered in test_changekind_completeness.py).

All 118 ChangeKinds (at the time of this snapshot; now 114 after taxonomy refactoring) have assertion-level test coverage. Previously, 3 ChangeKinds (SYMBOL_BINDING_STRENGTHENED, VAR_ACCESS_WIDENED, TYPE_VTABLE_CHANGED) were only referenced in set/list definitions but lacked explicit assertion tests. These are now covered in test_changekind_completeness.py.

Inline function scenarios (4): RemovedInlineMethod, removedInlineFunction, functionBecameInline, RemovedInlineVirtualFunction — these ABICC scenarios detect inline function removal via header comparison. In abicheck, inline functions declared in headers are parsed by castxml but filtered against ELF .dynsym (inline functions have no exported symbol). If headers are provided, castxml captures the declaration; detection depends on whether the symbol was previously exported. Virtual inline function removal is still detected via vtable changes (TYPE_VTABLE_CHANGED). These are classified as edge cases rather than gaps, since the typical ABI contract concerns exported symbols.