Skip to content

Case 04: No Change

Field Value
Verdict NO_CHANGE
Category No Change
Platforms Linux, macOS, Windows
Flags
Detected ChangeKinds
Source files browse on GitHub

Category: Symbol API | Verdict: ✅ NO_CHANGE (exit 0)

What breaks

Nothing. Recompiling with the same source produces a bit-for-bit equivalent ABI. This case confirms the baseline toolchain works correctly.

Why abidiff catches it

abidiff exits 0 — no differences in the ABI XML representation.

Code (identical both versions)

int stable_api(int x) { return x; }

Real Failure Demo

Severity: INFORMATIONAL (no ABI change — expected outcome)

Scenario: compile app against v1, swap in v2 .so without recompile.

# Build old library + app
gcc -shared -fPIC -g v1.c -o libfoo.so
gcc -g app.c -L. -lfoo -Wl,-rpath,. -o app
./app
# → stable_api(42) = 42

# Swap in new library (no recompile)
# v2.h is identical to v1.h — no .so yet
gcc -shared -fPIC -g v1.c -o libfoo.so   # use same source, no change
./app
# → stable_api(42) = 42   (identical output)

Why INFORMATIONAL: no ABI change means no breakage — this is the ideal state for patch releases. Use this as a sanity check to confirm your build and test pipeline works correctly.

Reproduce manually

gcc -shared -fPIC -g v1.c -o libfoo_v1.so
gcc -shared -fPIC -g v1.c -o libfoo_v2.so   # same source
abidw --out-file v1.xml libfoo_v1.so
abidw --out-file v2.xml libfoo_v2.so
abidiff v1.xml v2.xml
echo "exit: $?"   # → 0

How to fix

N/A — this is the ideal state for patch releases.

Real-world example

CI pipelines that run abidiff on every PR use this as the baseline to catch regressions: any non-zero exit from abidiff triggers a review gate.

References


Source files

See also: Examples overview · All NO_CHANGE cases · Category: No Change.