25 KiB
data_packets.obj exact-match log
Scope and provenance
- Translation unit:
source/memory/data_packets.c - January target:
build/split/source/memory/data_packets.obj - Candidate:
build/base/source/memory/data_packets.obj - Compiler: XDK 3911 CL 13.00.9254.1
- Flags: repository defaults (
/O2 /Oy- /DDEBUG /Dxbox) - Authority: January object bytes, COFF relocations, assert strings, and the repository's reconstructed packet layouts. Cross-build material is not accepted without January corroboration.
Validated baseline (2026-08-11)
The untouched 14f46f87 baseline is 3/6 strict-exact. The three public
wrappers are exact; the three recursive field walkers remain active.
| Function | Size T/B | Relocs T/B | Reloc identity | Target hash | Base hash | Result |
|---|---|---|---|---|---|---|
_data_packet_verify |
272/272 |
23/23 |
exact | b587488214be... |
b587488214be... |
exact |
_data_packet_encode |
256/256 |
16/16 |
exact | d7f1602034ca... |
d7f1602034ca... |
exact |
_data_packet_decode |
256/256 |
16/16 |
exact (proved alias) | f67dd668993d... |
f67dd668993d... |
exact |
_code_0010a5f0 |
464/464 |
27/27 |
differs | 7ecfeee48d0b... |
373321ae01f1... |
active |
_code_0010a7c0 |
768/768 |
44/39 |
differs | 8a525e33293d... |
dec56de1c3ba... |
active |
_code_0010aac0 |
672/672 |
28/28 |
differs | a565486c6862... |
4210e8448955... |
active |
The ordinary report showed the object's data as complete. The final hardened
owned-section audit confirmed all 14 January-owned .rdata COMDATs exact.
Accepted controls
- The existing public wrapper implementations are retained because they pass strict size, normalized-byte, and relocation-destination comparison.
- Recursive encoder/decoder calls remain in the same translation unit; their private calling conventions and inlining decisions must be evaluated as an atomic cluster.
- January and the independently recovered HCEA topology prove that the
verifier does not reset
field_sizefor version-ineligible fields. This is preserved asBUG (original); initializing it before the loop is the safe corrected-build alternative but is not the shipped behavior.
Experiment matrix
Every retained and rejected source family is recorded below. All measurements use the full six-function strict sweep, not size-only comparison.
| ID | Source shape | Size T/B | Relocs T/B | Base hash | First divergence | Siblings | Decision |
|---|---|---|---|---|---|---|---|
| B00 | untouched 14f46f87 baseline |
see table | see table | see table | disassembly audit pending | 3/3 public wrappers exact | baseline |
| E01 | initialize field_size once, then total_size, instead of resetting it inside the loop |
464/464 |
27/27 |
5a14c0cf7955... |
+0x09: candidate allocates the live zero to EDI before the end-sentinel test; target performs the test first |
3/3 public wrappers exact; other walkers unchanged | improved semantic topology, rejected code shape |
| E02 | chained field_size = total_size = 0 before the loop |
464/464 |
27/27 |
5a14c0cf7955... |
identical to E01 | 3/3 public wrappers exact | compiler-equivalent; rejected |
| E03 | declaration initializers for both verifier size locals | 464/464 |
27/27 |
4c795546f089... |
+0x09: still materializes zero in EDI before the sentinel test; only the following store/load schedule changes |
3/3 public wrappers exact | rejected |
| E04 | scoped word maximum_length = field->count before data_decode_string |
672/672 |
28/28 |
16491304fb03... |
+0x10d: emits one movzx; target uses xor reg,reg plus a partial mov word |
other five functions unchanged | improved signedness, rejected code shape |
| E05 | correct data_decode_string parameter to word in the shared declaration/definition |
672/672 |
28/28 |
a565486c6862... |
none | decoder walker and all 15 previously exact data_encoding.obj siblings pass; its one pre-existing residual is unchanged |
retained; _code_0010aac0 exact |
| E06 | leave verifier field_size uninitialized once, with no per-iteration reset, matching January/HCEA |
464/464 |
27/27 |
7ecfeee48d0b... |
none | all five siblings unchanged/exact-status preserved | retained; _code_0010a5f0 exact |
| E07 | hoist encoder case locals to function scope in target-like C89 order | 768/768 |
44/39 |
dec56de1c3ba... |
no code change; optimizer reconstructs the same live ranges | 5/5 exact siblings unchanged | compiler-equivalent; rejected |
| E08 | use a named encoding_state alias for every encoder call |
768/768 |
44/39 |
dec56de1c3ba... |
no code change; alias is folded | 5/5 exact siblings unchanged | compiler-equivalent; rejected |
| E09 | move the array element cursor initialization before the recursive verifier call | 768/768 |
44/39 |
e07a9f671b66... |
prologue/frame improve to 0x14; state now caches in EBX like target; recursive array region remains different |
5/5 exact siblings unchanged | retained as evidence-backed lifetime correction |
| E10 | introduce a separate 32-bit remaining-element down-counter | 768/752 |
44/39 |
cbdbe3befc2b... |
array loop changes to an unsigned-long pretest and removes January instructions | 5/5 exact siblings unchanged | regressed; reverted |
| E11 | move the inactive-string zero byte to the head of the declaration list |
768/768 |
44/39 |
e07a9f671b66... |
no code change; VC7 still colors it into [ebp+0xf] |
5/5 exact siblings unchanged | compiler-equivalent; rejected |
| E12 | remove the folded encoding_state alias and pass state directly after the E09 cursor-lifetime correction |
768/768 |
44/39 |
4bb1256ab4fb... |
prologue and frame now match January (sub esp,0x18); state/field/cursor occupy EBX/ESI/EDI; first residual is the active/inactive switch topology |
5/5 exact siblings unchanged | retained; establishes the correct local/register foundation |
| E13 | spell all six inactive fixed-field cases as separate identical call bodies | 768/816 |
44/46 |
e5078c777c8d... |
VC7 emits the desired direct nine-entry dispatch but retains six copies of the call body instead of cross-jumping them | 5/5 exact siblings unchanged | mechanism proved, over-expanded; reverted |
| E14 | keep pad+bytes together, but spell the other four inactive fixed-memory paths separately |
768/816 |
44/46 |
0b633ee4bb63... |
still retains five copies of the call body; a lowering-threshold change alone is insufficient | 5/5 exact siblings unchanged | rejected; superseded by January proof that inactive pad is a no-op |
| E15 | correct inactive pad to a no-op, independently corroborated by January's direct table and HCEA, while grouping only bytes/shorts/longs/int64/raw |
768/768 |
44/44 |
e955ee30862c... |
relocation identities now all exact; only 27 normalized bytes differ, confined to register/scheduling choices in the active data/raw/array region (+0x100..+0x148) |
5/5 exact siblings unchanged | retained; semantic and switch-topology correction |
| E16 | assign the array element cursor before loading element_count |
768/752 |
44/43 |
06d1edf5e47e... |
changes the early loop branch at +0x16 and collapses the array loop/code shape |
5/5 exact siblings unchanged | regressed; reverted |
| E17 | restore only data_size to the active data-case block, following the strict-exact decoder sibling's source topology |
768/768 |
44/44 |
e955ee30862c... |
byte-identical to E15; lexical scope alone does not rotate the scratch registers | 5/5 exact siblings unchanged | compiler-equivalent; retained for readable narrow scope |
| E18 | restore all four array locals to the array-case block while retaining the E09 pre-verifier cursor assignment | 768/768 |
44/44 |
e955ee30862c... |
byte-identical to E15/E17; lexical scope without initializer topology does not affect coloring | 5/5 exact siblings unchanged | compiler-equivalent; retained for readable narrow scope |
| E19 | initialize element_count and element at their block-scoped declarations in HCEA order |
768/768 |
44/44 |
e955ee30862c... |
byte-identical to E15/E17/E18; declaration initializers are folded to the same IR | 5/5 exact siblings unchanged | compiler-equivalent; retained as concise readable topology |
| E20 | narrow element_size to the recursive array-loop body, matching its actual lifetime |
768/768 |
44/44 |
e955ee30862c... |
byte-identical to E15-E19; the narrower source lifetime is recovered automatically | 5/5 exact siblings unchanged | compiler-equivalent; retained for readable scope |
| E21 | name the short-lived decoded_data + sizeof(short) pointer in the data case |
768/768 |
44/44 |
e955ee30862c... |
compiler folds the alias; no byte or register-color change | 5/5 exact siblings unchanged | compiler-equivalent; rejected as unnecessary |
| E22 | restore the inactive-string zero byte to its lexical case block |
768/768 |
44/44 |
e955ee30862c... |
byte-identical; the stack byte's lexical scope does not affect volatile scratch coloring | 5/5 exact siblings unchanged | compiler-equivalent; retained for narrow readable scope |
| E23 | HCEA-style direct cursor re-read for the lower-bound data-size correction, while retaining data_size for the upper bound |
768/752 |
44/43 |
d95711c22306... |
changes optimizer topology and collapses code/table structure despite equivalent valid-path semantics | 5/5 exact siblings unchanged | regressed; reverted |
| E24 | name the raw-field count in a block-scoped short before its encode call |
768/768 |
44/44 |
e955ee30862c... |
alias is folded; scratch-register colors remain unchanged | 5/5 exact siblings unchanged | compiler-equivalent; rejected as unnecessary |
| E25 | name field + 1 as a one-use element_fields pointer for the verifier call |
768/768 |
44/44 |
e955ee30862c... |
alias is folded; verifier argument construction and register colors are unchanged | 5/5 exact siblings unchanged | compiler-equivalent; proceed only by testing its meaningful shared lifetime |
| E26 | reuse the named element_fields pointer in both verifier and recursive encoder calls |
768/768 |
44/44 |
e955ee30862c... |
VC7 still recomputes/folds the subfield expression; no live-range or byte change | 5/5 exact siblings unchanged | compiler-equivalent; reverted as unnecessary |
| E27 | use one block-scoped data cursor alias for the data-size read and post-header encode source |
768/768 |
44/44 |
e955ee30862c... |
optimizer proves it identical to decoded_data; no live-range or color change |
5/5 exact siblings unchanged | compiler-equivalent; reverted as unnecessary |
| E28 | define a one-use definition alias only after the array element cursor is born, then pass it to the verifier |
768/768 |
44/44 |
e955ee30862c... |
the late alias is folded back to the stack parameter; its load remains hoisted and colors do not move | 5/5 exact siblings unchanged | compiler-equivalent; reverted as unnecessary |
| E29 | initialize data_size at its block-scoped declaration |
768/768 |
44/44 |
e955ee30862c... |
compiler-equivalent to the separate assignment; no scratch-color movement | 5/5 exact siblings unchanged | retained as concise HCEA-like source topology |
| E30 | define decoded_start from the parameter first, then define decoded_data from it |
768/768 |
44/44 |
e955ee30862c... |
aliases fold to the identical prologue and allocator graph; no color change | 5/5 exact siblings unchanged | compiler-equivalent; reverted to the clearer cursor-first form |
| E31 | share one function-scope post-header element pointer between the data and array cases |
768/768 |
44/44 |
e955ee30862c... |
SSA splits the mutually exclusive assignments; no emitted or allocation change | 5/5 exact siblings unchanged | compiler-equivalent; reverted to narrow case-local meaning |
| E32 | use the HCEA/PDB-indicated short const * private encoded-data parameter, with necessary byte-pointer casts |
768/768 |
44/44 |
e955ee30862c... |
ABI and IR normalize identically; public wrapper remains exact but residual colors do not move | 5/5 exact siblings unchanged | no January byte proof for the cross-build type; reverted |
| E33 | introduce an explicit signed long remaining-element down-counter after encoding the validated short count |
768/768 |
44/43 |
a683cffcd72d... |
loses one relocation and changes the array-loop lowering; the target's 32-bit stack counter is compiler-derived from the short post-decrement | 5/5 exact siblings unchanged | regressed; reverted |
| E34 | spell the array traversal as for (; element_count > 0; element_count--) |
768/768 |
44/44 |
e955ee30862c... |
VC7 normalizes it to the identical post-decrement loop and unchanged allocation | 5/5 exact siblings unchanged | compiler-equivalent; reverted to the concise while form |
| E35 | add the C register hint to the long-lived array element cursor |
768/768 |
44/44 |
e955ee30862c... |
VC7 ignores the hint under /O2; no byte or color change |
5/5 exact siblings unchanged | compiler-equivalent; reverted |
| E36 | make all three private packet walkers' definition pointers const-correct |
768/768 |
44/44 |
e955ee30862c... |
all six functions remain byte-identical to E15 status; qualifier does not alter alias scheduling | 5/5 exact siblings unchanged | no January type proof and no code effect; reverted |
| E37 | split the invalid data-size correction into if / else if branches |
768/768 |
44/44 |
7b2f8fe45a72... |
same calls/size but allocator and block layout diverge from +0x05 across 503 normalized bytes |
5/5 exact siblings unchanged | strongly regressed; rejected |
| E38 | split the invalid data-size correction into two independent if statements |
768/768 |
44/44 |
6f64a76ca15a... |
allocator diverges from +0x05 across 617 normalized bytes |
5/5 exact siblings unchanged | strongly regressed; reverted to the measured OR form |
| E39 | express the correction as the negation of the preceding valid-range predicate | 768/768 |
44/44 |
e955ee30862c... |
VC7 canonicalizes De Morgan's form to the identical OR graph and colors | 5/5 exact siblings unchanged | compiler-equivalent; superseded by the simpler OR form |
| E40 | assign corrected data_size with a ternary single-result expression |
768/768 |
44/44 |
7b2f8fe45a72... |
lowers like E37 and globally changes allocation across 503 normalized bytes | 5/5 exact siblings unchanged | strongly regressed; reverted |
| E41 | split the array element cursor into element = decoded_data; element += sizeof(short); |
768/768 |
44/44 |
e955ee30862c... |
optimizer recombines it to the same IR/lifetime and unchanged colors | 5/5 exact siblings unchanged | compiler-equivalent; reverted to one expression |
| E42 | split the data payload cursor into data = decoded_data; data += sizeof(short); after the integer call |
768/768 |
44/44 |
e955ee30862c... |
optimizer recombines it to the same pointer expression and color | 5/5 exact siblings unchanged | compiler-equivalent; reverted |
| E43 | spell the data payload as HCEA's typed (short const *)decoded_data + 1 pointer arithmetic |
768/768 |
44/44 |
e955ee30862c... |
type scaling is canonicalized to the same byte offset; scratch-register colors do not move | 5/5 exact siblings unchanged | compiler-equivalent; reverted to the clearer byte-pointer expression |
| E44 | bind element = decoded_data + sizeof(short) to the verifier's NULL second argument with a comma expression |
768/768 |
44/44 |
e955ee30862c... |
VC7 hoists the independent first-argument load anyway; the complete object is byte-identical to E15 | 5/5 exact siblings unchanged | legal and sequenced, but compiler-equivalent; rejected as less readable |
| E45 | bind the element assignment to the verifier's first argument with (element = ..., packet_definition) |
768/768 |
44/44 |
e955ee30862c... |
the comma dependency is removed during simplification; packet-definition load and all scratch colors remain byte-identical | 5/5 exact siblings unchanged | compiler-equivalent; rejected as less readable |
| E46 | bind the element assignment to verifier argument 3 as (element = ..., field + 1) |
768/768 |
44/44 |
e955ee30862c... |
despite matching January's apparent arg4/cursor/arg3 construction order, simplification again restores the identical E15 allocator graph | 5/5 exact siblings unchanged | compiler-equivalent; rejected as less readable |
| E47 | infer a short * private return from the target epilogue's live encoded_packet_size value and return that parameter |
768/768 |
44/44 |
e955ee30862c... |
ignored call results and the already-live epilogue value make the alternate prototype codegen-identical; HCEA still supports void |
5/5 exact siblings unchanged | no January type proof and no code effect; reverted to void |
| E48 | strict-exact TIFF donor topology: initialize element to the base before the verifier, then add the two-byte header after the call |
768/768 |
44/44 |
19d955b417b8... |
VC7 does not hoist the post-call add here; verifier call-site relocation identity/address changes and the cursor advances only after return | 5/5 exact siblings unchanged | structurally regressed; reverted |
| E49 | use HCEA's 32-bit int-equivalent return type for data_encode_integer instead of the repository's byte boolean |
768/768 |
44/44 |
e955ee30862c... |
the exact callee already materializes the same EAX value, and callers ignore it; both objects are byte-identical to E15 status | 5/5 exact siblings plus _data_encode_integer unchanged/exact |
no January type proof and no caller benefit; reverted |
| E50 | use HCEA's short const * cursor topology throughout the complete encoder, including typed header stepping and byte-cast stride updates |
768/768 |
44/44 |
e955ee30862c... |
VC7 canonicalizes every typed operation back to the same byte addresses; all three residual scratch regions remain unchanged | 5/5 exact siblings unchanged | compiler-equivalent; reverted to the repository's byte cursor |
| E51 | use one block-local short const *array view as the common lvalue for array count and element data |
768/768 |
44/44 |
e955ee30862c... |
the typed alias and both derived loads fold to the same SSA values and scratch colors | 5/5 exact siblings unchanged | compiler-equivalent; superseded by the simpler direct expressions |
| E52 | model both counted data and arrays through a readable { short count; byte data[1]; } payload structure |
768/768 |
44/44 |
e955ee30862c... |
member-lvalue provenance is flattened to the same two offsets and does not affect allocation | 5/5 exact siblings unchanged | compiler-equivalent; removed because HCEA supports the simpler cursor representation |
| E53 | share one function-scope short value_count across the active data, raw, and array arms |
768/752 |
44/43 |
06d1edf5e47e... |
the cross-arm scalar lifetime collapses the same array topology seen in E16 and loses one relocation | 5/5 exact siblings unchanged | structurally regressed; reverted to domain-specific block locals |
| E54 | initialize a named data-payload pointer before the data-size assert and keep it live through data_encode_integer |
768/768 |
44/44 |
8a525e33293d... |
none; the longer live range rotates the three volatile scratch roles to January's EAX/ECX/EDX assignment in the data, raw, and array arms | all five siblings exact | retained; _code_0010a7c0 exact and object code closes 6/6 |
Final strict result
All six functions are strict-exact under the hardened comparator: 2,688 of
2,688 padded code bytes, with every relocation count, address, type,
destination, and addend equal. The previously residual encoder now has target
and candidate normalized SHA-256
8a525e33293d96ad8abf852866cb1679d0ff28e794f81f617e884dc54718ecd7.
All 14 January-owned select-any .rdata COMDATs are also strict-exact: 528 of
528 bytes and no relocations. The candidate's additional 15-byte
"decoded_packet" select-any COMDAT is byte-identical to the January copy
selected from data_packet_groups.obj; it is duplicate COMDAT ownership, not
new mutable state or a semantic mismatch. The target owns no .data or
.bss in this object.
The decisive general code-generation lesson is lifetime rather than spelling:
merely naming decoded_data + sizeof(short) did nothing in E21, but creating
that pointer before the assert kept it live across validation and the integer
encode call. That changed VC7's interference graph without adding an
instruction, rotating all three later scratch-register choices at once.
Do-not-repeat and prohibited techniques
- Do not infer success from equal padded size; all three residuals currently demonstrate why relocation identity and normalized bytes are required.
- Do not use inline assembly,
volatile, undefined behavior, byte patches, or per-object compiler-flag changes. - Do not alter the three exact public wrappers without a complete six-function regression sweep.
Residual classification and reopen criteria
Resolved. No function in this object requires a parked, semantic, or fuzzy
source exception. Objdiff still mis-encodes the three private walkers' local
jump-table labels, so config/semantic_matches.json contains fail-closed
bookkeeping credits for those functions. Each credit is independently gated
by the hardened comparator; none relaxes byte or relocation identity. The
historical experiments remain above to prevent future edits from accidentally
shortening the payload pointer's lifetime or restoring the incorrect
inactive-pad behavior.
Original-bug policy adjudication
code_0010a5f0 intentionally preserves one shipped undefined read. January's
machine code bypasses every assignment to field_size when the first field is
outside the packet version range, then consumes the low word already resident
in EDI. HCEA independently records the same uninitialized value. A bounded
25-shape XDK 3911 experiment found no fully defined readable-C form with the
same bytes: normal zero initialization remains 464 bytes with 27 relocations,
but differs in 355 normalized byte positions.
This is admitted only under the project's explicit original-bug preservation
rule. It is not newly introduced undefined behavior, an optimizer exploit, or
a code-generation cast. The production comment labels the defect and states
the safe correction: initialize field_size to zero before the loop. The
complete experiment and machine-code proof are in
research/data_packets_verifier_init/REPORT.md.
Cross-build provenance
The October 2001 function at VA 0x11afa0 is instruction-identical through
the data, raw, and array cases, including the delayed packet-definition load.
The HCEA PDB independently preserves the original parameter names and assert
line numbers 253 and 281. These sources were used only to corroborate topology;
the January object remains the sole byte oracle.
Disposition
Admitted. Code and owned data are strict-exact. The consolidated build passes,
the shared data_encoding.obj sweep remains 15/16 with only its pre-existing
_data_decode_memory residual, and the admission audit reports zero revoked
objects. Progress recognizes all three verified local-label exceptions and
counts data_packets.obj as Matching: Halo now has 262/468 completed objects,
3,132/7,574 accepted-exact functions, and 366,133/1,770,166 exact code bytes on
this branch.
The conservative all-468-unit regression check against clean 14f46f87
reports 3,095 functions still exact, zero changed-nonexact functions, and
exactly the three packet walkers newly exact. Its only non-green structural
records are expected cross-worktree .debug$S path strings, the reviewed
Matching config change, and compiler-local $L... symbols owned by the three
newly exact sections; no code or non-debug data regression is present.
2026-08-13 independent admission revalidation
The completed object was independently transplanted onto campaign commit
5b2fbf0ff8782dc0899038e330125f1accfa1508 and rebuilt with the configured
XDK 3911 compiler and unchanged /O2 /Oy- /DDEBUG /Dxbox flags.
- All six functions remain strict-exact: 2,688/2,688 padded code bytes. Every relocation address, type, resolved destination, symbolic destination, and addend agrees.
- All fourteen target-owned
.rdataCOMDATs remain semantically and ownership-exact: 528/528 bytes and zero relocations. The candidate-onlydecoded_packetstring COMDAT is unchanged from the clean campaign baseline and remains a known select-any ownership artifact. - A clean pre-change manifest covered
data_packets,data_encoding, and thedata_packet_groupsconsumer. The post-change regression check reports zerochanged_nonexactfunctions in all three units. Its only non-green records are the intentional Matching/config ledger changes, the three newly exact packet walkers, and compiler-local$L...symbol movement inside those newly exact sections; no external symbol or owned-data change was introduced. - The consolidated build and semantic report pass with zero unit errors;
progress recognizes
data_packets.objas completed. The current tooling suite passes 173/173 tests. - The house-rule audit found one return per function, explicit
return;in every void function, one parameter per line, no raw tag/object access, and no newly introduced assembly, volatility, alignment directive, magic offset, or compiler-control construct. The documented uninitializedfield_sizeread is the original shipped defect described above, not a new optimizer technique; the adjacent comment retains its safe correction.