From 1f7e3789e7bb2fc02bd8c0a32c7958bb30e2be3e Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 16 Jan 2024 22:46:27 +0100 Subject: [PATCH] apply fix for UBSan "object-size" errors Running tests with clang-16 and the undefined behavior sanitizer (UBSan) produces errors such as the following in the immer library: ``` SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior 3rdParty/immer/immer/detail/hamts/node.hpp:224:26 in 3rdParty/immer/immer/detail/hamts/node.hpp:229:12: runtime error: member access within address 0x60300009a570 with insufficient space for an object of type 'node_t' (aka 'immer::detail::hamts::node, std::shared_ptr>, immer::map, std::shared_ptr, arangodb::consensus::Node::TransparentHash, arangodb::consensus::Node::TransparentEqual, immer::memory_policy>, immer::refcount_policy, immer::spinlock_policy, immer::no_transience_policy, false, true>>::hash_key, immer::map, std::shared_ptr, arangodb::consensus::Node::TransparentHash, arangodb::consensus::Node::TransparentEqual, immer::memory_policy>, immer::refcount_policy, immer::spinlock_policy, immer::no_transience_policy, false, true>>::equal_key, immer::memory_policy>, immer::refcount_policy, immer::spinlock_policy, immer::no_transience_policy, false, true>, 5>') 0x60300009a570: note: pointer points here 00 00 00 00 01 00 00 00 be be be be be be be be be be be be be be be be be be be be 00 00 00 00 ^ ``` the issue was reported to the upstream version of immer via https://github.com/arximboldi/immer/issues/274. the fix for the particular issue was written by @maierlars. --- immer/detail/hamts/node.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/immer/detail/hamts/node.hpp b/immer/detail/hamts/node.hpp index 6cee4e1b..d37dc0aa 100644 --- a/immer/detail/hamts/node.hpp +++ b/immer/detail/hamts/node.hpp @@ -99,8 +99,9 @@ struct node constexpr static std::size_t sizeof_inner_n(count_t count) { - return immer_offsetof(impl_t, d.data.inner.buffer) + + auto const inner_size = immer_offsetof(impl_t, d.data.inner.buffer) + sizeof(inner_t::buffer) * count; + return std::max(sizeof(node_t), inner_size); } #if IMMER_TAGGED_NODE