immer icon indicating copy to clipboard operation
immer copied to clipboard

GCC 12 gives lots of verbose warnings

Open bredelings opened this issue 2 years ago • 3 comments

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.

bredelings avatar Jul 06 '22 00:07 bredelings

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...

arximboldi avatar Jul 06 '22 08:07 arximboldi

I reported same issue here: #207

mcharneyamp avatar Nov 10 '22 14:11 mcharneyamp

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."

bredelings avatar Nov 10 '22 15:11 bredelings