Comments (7)
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.
Do you have the specific errors you were getting from the memory sanitizers available? And what C++ standard were you using?
from units.
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.
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.
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.
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.
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)
- Convert to inverse unit incorrect HOT 1
- Issues with parsing single-letter prefixes such as for `atto` HOT 7
- CleanUnitString breaks on 0.2 and 0.3 HOT 1
- Strange choice of units in to_string HOT 6
- Your units conversion service seems to be down... HOT 11
- "kg m" is parsed as "kg" HOT 1
- Surprising parse results with `.` and `-` HOT 4
- Question about to_string() function HOT 8
- Format arbitrary unit nicely HOT 4
- Degrees celsius get converted to Kelvin in operations HOT 6
- Function to remove a single user defined unit HOT 2
- Try to start a PR for adding support for KPa, MPa, GPa but permission denied HOT 3
- Using to_string for scalars causes crashes HOT 2
- "Stress testing" units' string parsing HOT 8
- Favoring SI base units in string formatting? HOT 3
- to_string strange output HOT 4
- expression did not evaluate to a constant HOT 4
- Unary negation of measurements HOT 1
- Please consider to use the googletest package instead of requiring the googletest source tree
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from units.