immer
immer copied to clipboard
GCC 12 gives lots of verbose warnings
Hi,
After upgrading to GCC 12, I've started getting a lot of warnings that immer is accessing outside array bounds:
In file included from ../../git/external/immer/immer/detail/hamts/champ.hpp:12,
from ../../git/external/immer/immer/map.hpp:12,
from ../../git/src/computation/typecheck/typecheck.H:7,
from ../../git/src/computation/typecheck/typecheck.cc:1:
In static member function ‘static immer::detail::hamts::node<T, Hash, Equal, MemoryPolicy, B>::node_t* immer::detail::hamts::node<T, Hash, Equal, MemoryPolicy, B>::make_inner_n(immer::detail::hamts::count_t) [with T = std::pair<std::__cxx11::basic_string<char>, Haskell::Type>; Hash = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::hash_key; Equal = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::equal_key; MemoryPolicy = immer::memory_policy<immer::free_list_heap_policy<immer::cpp_heap>, immer::refcount_policy, immer::spinlock_policy>; unsigned int B = 5]’,
inlined from ‘static immer::detail::hamts::champ<T, Hash, Equal, MemoryPolicy, B>::node_t* immer::detail::hamts::champ<T, Hash, Equal, MemoryPolicy, B>::empty() [with T = std::pair<std::__cxx11::basic_string<char>, Haskell::Type>; Hash = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::hash_key; Equal = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::equal_key; MemoryPolicy = immer::memory_policy<immer::free_list_heap_policy<immer::cpp_heap>, immer::refcount_policy, immer::spinlock_policy>; unsigned int B = 5]’ at ../../git/external/immer/immer/detail/hamts/champ.hpp:137:54:
../../git/external/immer/immer/detail/hamts/node.hpp:225:38: warning: array subscript ‘immer::detail::hamts::node<std::pair<std::__cxx11::basic_string<char>, Haskell::Type>, immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::hash_key, immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::equal_key, immer::memory_policy<immer::free_list_heap_policy<immer::cpp_heap>, immer::refcount_policy, immer::spinlock_policy>, 5>[0]’ is partly outside array bounds of ‘unsigned char [24]’ [-Warray-bounds]
225 | p->impl.d.data.inner.nodemap = 0;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
In file included from ../../git/external/immer/immer/memory_policy.hpp:11,
from ../../git/external/immer/immer/map.hpp:14:
In static member function ‘static void* immer::cpp_heap::allocate(std::size_t, Tags ...) [with Tags = {}]’,
inlined from ‘static void* immer::identity_heap<Base>::allocate(std::size_t, Tags ...) [with Tags = {}; Base = immer::cpp_heap]’ at ../../git/external/immer/immer/heap/identity_heap.hpp:24:30,
inlined from ‘static immer::detail::hamts::node<T, Hash, Equal, MemoryPolicy, B>::node_t* immer::detail::hamts::node<T, Hash, Equal, MemoryPolicy, B>::make_inner_n(immer::detail::hamts::count_t) [with T = std::pair<std::__cxx11::basic_string<char>, Haskell::Type>; Hash = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::hash_key; Equal = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::equal_key; MemoryPolicy = immer::memory_policy<immer::free_list_heap_policy<immer::cpp_heap>, immer::refcount_policy, immer::spinlock_policy>; unsigned int B = 5]’ at ../../git/external/immer/immer/detail/hamts/node.hpp:219:32,
inlined from ‘static immer::detail::hamts::champ<T, Hash, Equal, MemoryPolicy, B>::node_t* immer::detail::hamts::champ<T, Hash, Equal, MemoryPolicy, B>::empty() [with T = std::pair<std::__cxx11::basic_string<char>, Haskell::Type>; Hash = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::hash_key; Equal = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::equal_key; MemoryPolicy = immer::memory_policy<immer::free_list_heap_policy<immer::cpp_heap>, immer::refcount_policy, immer::spinlock_policy>; unsigned int B = 5]’ at ../../git/external/immer/immer/detail/hamts/champ.hpp:137:54:
../../git/external/immer/immer/heap/cpp_heap.hpp:28:30: note: object of size 24 allocated by ‘operator new’
28 | return ::operator new(size);
| ~~~~~~~~~~~~~~^~~~~~
In static member function ‘static immer::detail::hamts::node<T, Hash, Equal, MemoryPolicy, B>::node_t* immer::detail::hamts::node<T, Hash, Equal, MemoryPolicy, B>::make_inner_n(immer::detail::hamts::count_t) [with T = std::pair<std::__cxx11::basic_string<char>, Haskell::Type>; Hash = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::hash_key; Equal = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::equal_key; MemoryPolicy = immer::memory_policy<immer::free_list_heap_policy<immer::cpp_heap>, immer::refcount_policy, immer::spinlock_policy>; unsigned int B = 5]’,
inlined from ‘static immer::detail::hamts::champ<T, Hash, Equal, MemoryPolicy, B>::node_t* immer::detail::hamts::champ<T, Hash, Equal, MemoryPolicy, B>::empty() [with T = std::pair<std::__cxx11::basic_string<char>, Haskell::Type>; Hash = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::hash_key; Equal = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::equal_key; MemoryPolicy = immer::memory_policy<immer::free_list_heap_policy<immer::cpp_heap>, immer::refcount_policy, immer::spinlock_policy>; unsigned int B = 5]’ at ../../git/external/immer/immer/detail/hamts/champ.hpp:137:54:
../../git/external/immer/immer/detail/hamts/node.hpp:227:38: warning: array subscript ‘immer::detail::hamts::node<std::pair<std::__cxx11::basic_string<char>, Haskell::Type>, immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::hash_key, immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::equal_key, immer::memory_policy<immer::free_list_heap_policy<immer::cpp_heap>, immer::refcount_policy, immer::spinlock_policy>, 5>[0]’ is partly outside array bounds of ‘unsigned char [24]’ [-Warray-bounds]
227 | p->impl.d.data.inner.values = nullptr;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~
In static member function ‘static void* immer::cpp_heap::allocate(std::size_t, Tags ...) [with Tags = {}]’,
inlined from ‘static void* immer::identity_heap<Base>::allocate(std::size_t, Tags ...) [with Tags = {}; Base = immer::cpp_heap]’ at ../../git/external/immer/immer/heap/identity_heap.hpp:24:30,
inlined from ‘static immer::detail::hamts::node<T, Hash, Equal, MemoryPolicy, B>::node_t* immer::detail::hamts::node<T, Hash, Equal, MemoryPolicy, B>::make_inner_n(immer::detail::hamts::count_t) [with T = std::pair<std::__cxx11::basic_string<char>, Haskell::Type>; Hash = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::hash_key; Equal = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::equal_key; MemoryPolicy = immer::memory_policy<immer::free_list_heap_policy<immer::cpp_heap>, immer::refcount_policy, immer::spinlock_policy>; unsigned int B = 5]’ at ../../git/external/immer/immer/detail/hamts/node.hpp:219:32,
inlined from ‘static immer::detail::hamts::champ<T, Hash, Equal, MemoryPolicy, B>::node_t* immer::detail::hamts::champ<T, Hash, Equal, MemoryPolicy, B>::empty() [with T = std::pair<std::__cxx11::basic_string<char>, Haskell::Type>; Hash = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::hash_key; Equal = immer::map<std::__cxx11::basic_string<char>, Haskell::Type>::equal_key; MemoryPolicy = immer::memory_policy<immer::free_list_heap_policy<immer::cpp_heap>, immer::refcount_policy, immer::spinlock_policy>; unsigned int B = 5]’ at ../../git/external/immer/immer/detail/hamts/champ.hpp:137:54:
../../git/external/immer/immer/heap/cpp_heap.hpp:28:30: note: object of size 24 allocated by ‘operator new’
28 | return ::operator new(size);
| ~~~~~~~~~~~~~~^~~~~~
I am not sure if this indicates a real problem or not... but it is a bit worrisome.
I suspect it is a false positive, because that is the kind of issue that would have been found with AddressSanitizer ages ago. But maybe worth investigating...
I reported same issue here: #207
A number of people seem to have reported new warnings from GCC 12 for -Warray-bounds
.
Here's an example: https://bugzilla.redhat.com/show_bug.cgi?id=2047439
"This instance of -Warray-bounds usually triggers when accessing an object of a smaller size through a pointer to a larger type."