ABICC vs Abicheck: Test Coverage Comparison¶
Updated: 2026-03-09; content reviewed 2026-06-07. The ABICC rule mapping is a historical parity snapshot; the current ChangeKind total is 254, see the Change Kind Reference. Source: ABICC
RulesBin.xml(196 rules),RulesSrc.xml(100 rules +Removed_Const_Overload),RegTests.pm(~153 C++ + ~102 C named scenarios) Target: abicheckexamples/(129 cases; the original 74-case subset is the release-pinned cross-tool benchmark),tests/(large unit/integration/parity suite),ChangeKindenum (254 change kinds today; the per-rule mappings below were written against an earlier snapshot)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 | 254 change kinds (this table's per-rule mappings reflect an earlier snapshot) |
| All ChangeKinds have assertion tests | Yes (enforced by test_changekind_completeness.py) |
| Abicheck example cases | 129 |
| 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 254 ChangeKinds have assertion-level test coverage today, enforced by test_changekind_completeness.py. 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.
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.