Skip to content

test: avoid strict-aliasing/alignment UB in unit tests#110

Draft
l0rinc wants to merge 3 commits intomasterfrom
l0rinc/strict-aliasing-cleanups
Draft

test: avoid strict-aliasing/alignment UB in unit tests#110
l0rinc wants to merge 3 commits intomasterfrom
l0rinc/strict-aliasing-cleanups

Conversation

@l0rinc
Copy link
Copy Markdown
Owner

@l0rinc l0rinc commented Jan 28, 2026

WIP

The unit tests were writing through typed pointers into byte storage:
- `cuckoocache_tests.cpp` casted `uint256::begin()` to `uint32_t*` and wrote words. This is strict-aliasing UB (and can be miscompiled under -O2). Replace with `WriteLE32()` stores into the byte buffer.
- `allocator_tests.cpp` casted an untyped `void*` allocation to `uint32_t*` and dereferenced it. This can be misaligned access UB on some platforms. Replace with `std::memcpy()` store/load.
Clean up pass-by-const-ref of fundamental types:
- `CScriptNum` `int64_t` ctor/operators and `serialize()` now take `int64_t` by value instead of `const int64_t&` (no logic change; avoids unnecessary references in a hot/consensus-adjacent header).
- `memusage::DynamicUsage()` overloads for built-in scalars/pointers take values by value (still always returns 0).
- `coinselection.cpp` loop index uses `size_t` by value instead of `const size_t&`.
The SHA-NI implementation used `(__m128i*)` casts with `_mm_loadu_si128` and `_mm_storeu_si128`. Switch to `__m128i_u` (with a safe fallback typedef) so unaligned access is explicit and we avoid relying on type-punned SIMD pointer casts for these intrinsics.

No intended behavior or performance change.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant