Files
Cesarus85--mjolnir-vr/docs/object_matching_logs/data_packets_obj.md
T

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_size for version-ineligible fields. This is preserved as BUG (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 .rdata COMDATs remain semantically and ownership-exact: 528/528 bytes and zero relocations. The candidate-only decoded_packet string 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 the data_packet_groups consumer. The post-change regression check reports zero changed_nonexact functions 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.obj as 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 uninitialized field_size read is the original shipped defect described above, not a new optimizer technique; the adjacent comment retains its safe correction.