Giter Site home page Giter Site logo

Comments (7)

phlptp avatar phlptp commented on August 18, 2024

I will take a look, thanks.
I run some memory sanitizers on the code, but like you said it is possible things show up differently in the test suite.

from units.

phlptp avatar phlptp commented on August 18, 2024

Do you have the specific errors you were getting from the memory sanitizers available? And what C++ standard were you using?

from units.

jl-wynen avatar jl-wynen commented on August 18, 2024

clang++ --version:

clang version 15.0.7
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

The library is configured with

UNITS_ENABLE_TESTS = OFF
UNITS_BASE_TYPE = int64_t
UNITS_NAMESPACE = llnl::units
CMAKE_CXX_STANDARD = 17
CMAKE_CXX_STANDARD_REQUIRED = ON
CMAKE_CXX_EXTENSIONS = OFF

And here is the error:

==11717==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x7f1e4390c5e5 in llnl::units::detail::unit_data::equivalent_non_counting(llnl::units::detail::unit_data const&) const /home/jl/.conan/data/LLNL-Units/0.7.0/_/_/package/2d291ed62cacba0562de94b6c74488442a93d8fb/include/units/units_decl.hpp:261:43
    #1 0x7f1e4390bc41 in llnl::units::detail::unit_data::operator==(llnl::units::detail::unit_data const&) const /home/jl/.conan/data/LLNL-Units/0.7.0/_/_/package/2d291ed62cacba0562de94b6c74488442a93d8fb/include/units/units_decl.hpp:237:20
    #2 0x7f1e4390d882 in llnl::units::detail::unit_data::operator!=(llnl::units::detail::unit_data const&) const /home/jl/.conan/data/LLNL-Units/0.7.0/_/_/package/2d291ed62cacba0562de94b6c74488442a93d8fb/include/units/units_decl.hpp:244:28
    #3 0x7f1e43a1ddb0 in llnl::units::unit::operator==(llnl::units::unit const&) const /home/jl/.conan/data/LLNL-Units/0.7.0/_/_/build/2d291ed62cacba0562de94b6c74488442a93d8fb/units/units/units_decl.hpp:588:25
    #4 0x7f1e43a1f740 in std::equal_to<llnl::units::unit>::operator()(llnl::units::unit const&, llnl::units::unit const&) const /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/stl_function.h:378:20
    #5 0x7f1e43a1f03a in std::__detail::_Hashtable_base<llnl::units::unit, std::pair<llnl::units::unit const, char const*>, std::__detail::_Select1st, std::equal_to<llnl::units::unit>, std::hash<llnl::units::unit>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, false, true>>::_M_key_equals(llnl::units::unit const&, std::__detail::_Hash_node_value<std::pair<llnl::units::unit const, char const*>, true> const&) const /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/hashtable_policy.h:1688:9
    #6 0x7f1e43a1fc76 in std::__detail::_Hashtable_base<llnl::units::unit, std::pair<llnl::units::unit const, char const*>, std::__detail::_Select1st, std::equal_to<llnl::units::unit>, std::hash<llnl::units::unit>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, false, true>>::_M_equals(llnl::units::unit const&, unsigned long, std::__detail::_Hash_node_value<std::pair<llnl::units::unit const, char const*>, true> const&) const /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/hashtable_policy.h:1707:39
    #7 0x7f1e43a1fb9a in std::_Hashtable<llnl::units::unit, std::pair<llnl::units::unit const, char const*>, std::allocator<std::pair<llnl::units::unit const, char const*>>, std::__detail::_Select1st, std::equal_to<llnl::units::unit>, std::hash<llnl::units::unit>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true>>::_M_find_before_node(unsigned long, llnl::units::unit const&, unsigned long) const /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/hashtable.h:1937:14
    #8 0x7f1e43a1f15c in std::_Hashtable<llnl::units::unit, std::pair<llnl::units::unit const, char const*>, std::allocator<std::pair<llnl::units::unit const, char const*>>, std::__detail::_Select1st, std::equal_to<llnl::units::unit>, std::hash<llnl::units::unit>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true>>::_M_find_node(unsigned long, llnl::units::unit const&, unsigned long) const /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/hashtable.h:816:31
    #9 0x7f1e43a1ece4 in std::pair<std::__detail::_Node_iterator<std::pair<llnl::units::unit const, char const*>, false, true>, bool> std::_Hashtable<llnl::units::unit, std::pair<llnl::units::unit const, char const*>, std::allocator<std::pair<llnl::units::unit const, char const*>>, std::__detail::_Select1st, std::equal_to<llnl::units::unit>, std::hash<llnl::units::unit>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true>>::_M_emplace<llnl::units::unit const&, char const* const&>(std::integral_constant<bool, true>, llnl::units::unit const&, char const* const&) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/hashtable.h:2076:25
    #10 0x7f1e43a1eaa1 in std::pair<std::__detail::_Node_iterator<std::pair<llnl::units::unit const, char const*>, false, true>, bool> std::_Hashtable<llnl::units::unit, std::pair<llnl::units::unit const, char const*>, std::allocator<std::pair<llnl::units::unit const, char const*>>, std::__detail::_Select1st, std::equal_to<llnl::units::unit>, std::hash<llnl::units::unit>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true>>::emplace<llnl::units::unit const&, char const* const&>(llnl::units::unit const&, char const* const&) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/hashtable.h:950:11
    #11 0x7f1e43a1e8b1 in std::pair<std::__detail::_Node_iterator<std::pair<llnl::units::unit const, char const*>, false, true>, bool> std::unordered_map<llnl::units::unit, char const*, std::hash<llnl::units::unit>, std::equal_to<llnl::units::unit>, std::allocator<std::pair<llnl::units::unit const, char const*>>>::emplace<llnl::units::unit const&, char const* const&>(llnl::units::unit const&, char const* const&) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/unordered_map.h:389:16
    #12 0x7f1e439fe113 in llnl::units::getDefinedBaseUnitNames() /home/jl/.conan/data/LLNL-Units/0.7.0/_/_/build/2d291ed62cacba0562de94b6c74488442a93d8fb/units/units/units.cpp:152:26
    #13 0x7f1e438ddb3f in __cxx_global_var_init.1 /home/jl/.conan/data/LLNL-Units/0.7.0/_/_/build/2d291ed62cacba0562de94b6c74488442a93d8fb/units/units/units.cpp:158:37
    #14 0x7f1e438e21fd in _GLOBAL__sub_I_units.cpp /home/jl/.conan/data/LLNL-Units/0.7.0/_/_/build/2d291ed62cacba0562de94b6c74488442a93d8fb/units/units/units.cpp
    #15 0x7f1e48e290fd  (/lib64/ld-linux-x86-64.so.2+0x50fd) (BuildId: 990e684775b66507dd913951554d83d689684408)
    #16 0x7f1e48e291eb  (/lib64/ld-linux-x86-64.so.2+0x51eb) (BuildId: 990e684775b66507dd913951554d83d689684408)
    #17 0x7f1e48e3eeff  (/lib64/ld-linux-x86-64.so.2+0x1aeff) (BuildId: 990e684775b66507dd913951554d83d689684408)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/jl/.conan/data/LLNL-Units/0.7.0/_/_/package/2d291ed62cacba0562de94b6c74488442a93d8fb/include/units/units_decl.hpp:261:43 in llnl::units::detail::unit_data::equivalent_non_counting(llnl::units::detail::unit_data const&) const

from units.

phlptp avatar phlptp commented on August 18, 2024

The value used in that call comes from a constexpr array so that shouldn't by definition be uninitialized. That leaves the local unordered map that it fills. Which my understanding is that should be default initialized. But I suppose it is possible in the newer clang they do something a little different with the initializer in the global var init stage, maybe combined with the optimization level and the way it is used. I put an empty brace initialization on the map just in case to make it very explicit. should be in the current PR. I will merge it once it passes all the tests. You could try adding the braces to line 149 if you want to test earlier I suppose.

from units.

jl-wynen avatar jl-wynen commented on August 18, 2024

The error still happens with this change. But it looks different now:

Uninitialized bytes in MemcmpInterceptorCommon at offset 0 inside [0x7050000003d8, 1)
==24532==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x562b014c191d in __interceptor_memcmp (/home/jl/Work/scipp-1/cmake-build-debug-clang/bin/scipp-units-test+0xc091d) (BuildId: bf2196029ab7e4599adf0c7a863977c6a53dd453)
    #1 0x562b015ae03b in std::char_traits<char>::compare(char const*, char const*, unsigned long) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/char_traits.h:385:9
    #2 0x562b015adfcd in __gnu_cxx::__enable_if<__is_char<char>::__value, bool>::__type std::operator==<char>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/basic_string.h:3587:12
    #3 0x7f5e16ad82ea in std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>::operator()(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&) const /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/stl_function.h:378:20
    #4 0x7f5e16c0e24a in std::__detail::_Hashtable_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, llnl::units::precise_unit>, std::__detail::_Select1st, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, false, true>>::_M_key_equals(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__detail::_Hash_node_value<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, llnl::units::precise_unit>, true> const&) const /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/hashtable_policy.h:1688:9
    #5 0x7f5e16c0de0f in std::pair<std::__detail::_Node_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, llnl::units::precise_unit>, false, true>, bool> std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, llnl::units::precise_unit>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, llnl::units::precise_unit>>, std::__detail::_Select1st, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true>>::_M_emplace<char const* const&, llnl::units::precise_unit const&>(std::integral_constant<bool, true>, char const* const&, llnl::units::precise_unit const&) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/hashtable.h:2068:18
    #6 0x7f5e16c0dcf1 in std::pair<std::__detail::_Node_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, llnl::units::precise_unit>, false, true>, bool> std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, llnl::units::precise_unit>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, llnl::units::precise_unit>>, std::__detail::_Select1st, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true>>::emplace<char const* const&, llnl::units::precise_unit const&>(char const* const&, llnl::units::precise_unit const&) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/hashtable.h:950:11
    #7 0x7f5e16c0dc01 in std::pair<std::__detail::_Node_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, llnl::units::precise_unit>, false, true>, bool> std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, llnl::units::precise_unit, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, llnl::units::precise_unit>>>::emplace<char const* const&, llnl::units::precise_unit const&>(char const* const&, llnl::units::precise_unit const&) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.1/../../../../include/c++/12.2.1/bits/unordered_map.h:389:16
    #8 0x7f5e16beecbe in llnl::units::loadDefinedUnits[abi:cxx11]() /home/jl/.conan/data/LLNL-Units/3b7c444/_/_/build/2d291ed62cacba0562de94b6c74488442a93d8fb/units/units/units.cpp:2679:24
    #9 0x7f5e16ac6ddf in __cxx_global_var_init.20 /home/jl/.conan/data/LLNL-Units/3b7c444/_/_/build/2d291ed62cacba0562de94b6c74488442a93d8fb/units/units/units.cpp:2693:36
    #10 0x7f5e16aca346 in _GLOBAL__sub_I_units.cpp /home/jl/.conan/data/LLNL-Units/3b7c444/_/_/build/2d291ed62cacba0562de94b6c74488442a93d8fb/units/units/units.cpp
    #11 0x7f5e16c830fd  (/lib64/ld-linux-x86-64.so.2+0x50fd) (BuildId: 990e684775b66507dd913951554d83d689684408)
    #12 0x7f5e16c831eb  (/lib64/ld-linux-x86-64.so.2+0x51eb) (BuildId: 990e684775b66507dd913951554d83d689684408)
    #13 0x7f5e16c98eff  (/lib64/ld-linux-x86-64.so.2+0x1aeff) (BuildId: 990e684775b66507dd913951554d83d689684408)

SUMMARY: MemorySanitizer: use-of-uninitialized-value (/home/jl/Work/scipp-1/cmake-build-debug-clang/bin/scipp-units-test+0xc091d) (BuildId: bf2196029ab7e4599adf0c7a863977c6a53dd453) in __interceptor_memcmp

This is a debug build, BTW.

Please let me know if there is something else I should try to fix or pin down the issue!

from units.

phlptp avatar phlptp commented on August 18, 2024
smap knownUnits{};  //2676  This is default initialized
    for (const auto& pr : defined_unit_strings_si) {  //2677 defined_unit_strings_si is a constexpr
        if (pr.first != nullptr) {  //check for null
            knownUnits.emplace(pr.first, pr.second);  //2679  the uninitialized warning occurs here, with either pr.first or knownUnits
        }
    }

The defined unit string is constexpr, I have another check that verifies all the elements in it, so pretty confident that is fine, and I don't know how anything else could be considered uninitialized. Did you build the standard library with the sanitizer enabled? If not I have occasionally had trouble with std::string showing up as a false positive on memory sanitizers before. In which case unless you are seeing something else it could be, I would suggest adding this to the ignore list and I will keep an eye out on the future as I am out of ideas of what it could be.

from units.

jl-wynen avatar jl-wynen commented on August 18, 2024

I didn't build the standard library with sanitizer enabled. And I agree that the code should be fine.
Since this doesn't show up in my attempt at a minimal reproducer and I have not seen any issues in practice, I agree to leave it be.

from units.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.