Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GCC 12 gives lots of verbose warnings #223

Open
bredelings opened this issue Jul 6, 2022 · 3 comments
Open

GCC 12 gives lots of verbose warnings #223

bredelings opened this issue Jul 6, 2022 · 3 comments

Comments

@bredelings
Copy link

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 bredelings changed the title GCC 12 remove lots of verbose warnings GCC 12 gives lots of verbose warnings Jul 6, 2022
@arximboldi
Copy link
Owner

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

@mcharneyamp
Copy link

I reported same issue here: #207

@bredelings
Copy link
Author

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

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

No branches or pull requests

3 participants