[libc-commits] [libc] [libc][stdlib] Fix UB in freelist (PR #95330)
via libc-commits
libc-commits at lists.llvm.org
Wed Jun 12 17:18:33 PDT 2024
================
@@ -92,19 +93,14 @@ bool FreeList<NUM_BUCKETS>::add_chunk(span<cpp::byte> chunk) {
if (chunk.size() < sizeof(FreeListNode))
return false;
- union {
- FreeListNode *node;
- cpp::byte *bytes;
- } aliased;
-
- aliased.bytes = chunk.data();
-
+ // Add it to the correct list.
size_t chunk_ptr = find_chunk_ptr_for_size(chunk.size(), false);
- // Add it to the correct list.
- aliased.node->size = chunk.size();
- aliased.node->next = chunks_[chunk_ptr];
- chunks_[chunk_ptr] = aliased.node;
+ FreeListNode node;
+ node.next = chunks_[chunk_ptr];
+ node.size = chunk.size();
+ LIBC_NAMESPACE::memcpy(chunk.data(), &node, sizeof(node));
----------------
lntue wrote:
How about using `cpp::bit_cast` instead? https://github.com/llvm/llvm-project/blob/main/libc/src/__support/CPP/bit.h#L36
https://github.com/llvm/llvm-project/pull/95330
More information about the libc-commits
mailing list