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: abicheckexamples/(63 cases),tests/(690+ tests),ChangeKindenum (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.dynsymsymbol 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.