greg7mdp / parallel-hashmap

A family of header-only, very fast and memory-friendly hashmap and btree containers.
https://greg7mdp.github.io/parallel-hashmap/
Apache License 2.0
2.47k stars 234 forks source link

asan build on linux failed with memory error #218

Closed lucoysword closed 9 months ago

lucoysword commented 9 months ago

Build a program using parallel-hashmap with "asan" option, generates a map and save it. In test program (build with asan option) load it. Asan will suggest memory error.

phmap::flat_hash_map<uint64, float>* hash_map
phmap::BinaryInputArchive ar_in(hashmap_file.c_str());
if (!hash_map->phmap_load(ar_in)) {
  LOG_ERR("Failed to load ", hashmap_file);
  return false;
}

#0 0x7f24357c8587 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cc:104
#1 0x55d4ae0e04ca in __gnu_cxx::new_allocator<phmap::priv::Allocate<8ul, std::allocator<std::pair<unsigned long const, float> > >(std::allocator<std::pair<unsigned long const, float> >*, unsigned long)::M>::allocate(unsigned long, void const*) /usr/include/c++/9/ext/new_allocator.h:114
#2 0x55d4ae0dc422 in phmap::allocator_traits<std::allocator<phmap::priv::Allocate<8ul, std::allocator<std::pair<unsigned long const, float> > >(std::allocator<std::pair<unsigned long const, float> >*, unsigned long)::M> >::allocate(std::allocator<phmap::priv::Allocate<8ul, std::allocator<std::pair<unsigned long const, float> > >(std::allocator<std::pair<unsigned long const, float> >*, unsigned long)::M>&, unsigned long) third_party/parallel_hashmap/phmap_base.h:1472
#3 0x55d4ae0d8d80 in void* phmap::priv::Allocate<8ul, std::allocator<std::pair<unsigned long const, float> > >(std::allocator<std::pair<unsigned long const, float> >*, unsigned long) third_party/parallel_hashmap/phmap_base.h:4192
#4 0x55d4ae0d5765 in phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::initialize_slots(unsigned long) third_party/parallel_hashmap/phmap.h:2000
#5 0x55d4ae0e9af2 in phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::resize(unsigned long) third_party/parallel_hashmap/phmap.h:2038
#6 0x55d4ae0e9673 in phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::rehash_and_grow_if_necessary() third_party/parallel_hashmap/phmap.h:2125
#7 0x55d4ae0e8989 in phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::prepare_insert(unsigned long) third_party/parallel_hashmap/phmap.h:2217
#8 0x55d4ae0e7609 in std::pair<unsigned long, bool> phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::find_or_prepare_insert<unsigned long>(unsigned long const&, unsigned long) third_party/parallel_hashmap/phmap.h:2210
#9 0x55d4ae0e612f in std::pair<phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::iterator, bool> phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::emplace_decomposable<unsigned long, std::piecewise_construct_t const&, std::tuple<unsigned long&&>, std::tuple<float&&> >(unsigned long const&, unsigned long, std::piecewise_construct_t const&, std::tuple<unsigned long&&>&&, std::tuple<float&&>&&) third_party/parallel_hashmap/phmap.h:1900
#10 0x55d4ae0e4840 in std::pair<phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::iterator, bool> phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable::operator()<unsigned long, std::piecewise_construct_t const&, std::tuple<unsigned long&&>, std::tuple<float&&> >(unsigned long const&, std::piecewise_construct_t const&, std::tuple<unsigned long&&>&&, std::tuple<float&&>&&) const third_party/parallel_hashmap/phmap.h:1912
#11 0x55d4ae0e29f7 in decltype (((declval<phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable>)())((declval<unsigned long&& const&>)(), std::piecewise_construct, (declval<std::tuple<unsigned long&&> >)(), (declval<std::tuple<float&&> >)())) phmap::priv::memory_internal::DecomposePairImpl<phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable, unsigned long&&, std::tuple<float&&> >(phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable&&, std::pair<std::tuple<unsigned long&&>, std::tuple<float&&> >) third_party/parallel_hashmap/phmap.h:757
#12 0x55d4ae0e05d4 in decltype (DecomposePairImpl((forward<phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable>)({parm#1}), PairArgs((forward<std::pair<unsigned long, float> >)({parm#2})))) phmap::priv::DecomposePair<phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable, std::pair<unsigned long, float> >(phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable&&, std::pair<unsigned long, float>&&) third_party/parallel_hashmap/phmap.h:4170
#13 0x55d4ae0dc49d in decltype (DecomposePair((declval<phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable>)(), (declval<std::pair<unsigned long, float> >)())) phmap::priv::FlatHashMapPolicy<unsigned long, float>::apply<phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable, std::pair<unsigned long, float> >(phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable&&, std::pair<unsigned long, float>&&) third_party/parallel_hashmap/phmap.h:4275
#14 0x55d4ae0d90d8 in decltype (phmap::priv::FlatHashMapPolicy<unsigned long, float>::apply((forward<phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable>)({parm#1}), (forward<std::pair<unsigned long, float> >)({parm#2}))) phmap::priv::hash_policy_traits<phmap::priv::FlatHashMapPolicy<unsigned long, float>, void>::apply<phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable, std::pair<unsigned long, float>, phmap::priv::FlatHashMapPolicy<unsigned long, float> >(phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::EmplaceDecomposable&&, std::pair<unsigned long, float>&&) third_party/parallel_hashmap/phmap_base.h:548
#15 0x55d4ae0d59e2 in std::pair<phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::iterator, bool> phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::emplace<std::pair<unsigned long, float>, 0>(std::pair<unsigned long, float>&&) third_party/parallel_hashmap/phmap.h:1439
#16 0x55d4ae0d246b in phmap::priv::raw_hash_set<phmap::priv::FlatHashMapPolicy<unsigned long, float>, phmap::Hash<unsigned long>, phmap::EqualTo<unsigned long>, std::allocator<std::pair<unsigned long const, float> > >::insert(std::pair<unsigned long, float>&&) third_party/parallel_hashmap/phmap.h:1329
lucoysword commented 9 months ago

Correction. The error was not triggered by phmap_load, but the following line. hash_map->insert({hash, val});

greg7mdp commented 9 months ago

Hi @lucoysword , thank you for the error report. Can you show the ASAN error itself?

greg7mdp commented 9 months ago

Closing this issue as I don't know how to reproduce the error. Please provide test program and compilation command. Thanks!