Skip to content

Instantly share code, notes, and snippets.

@azat
Created April 29, 2021 07:42
Show Gist options
  • Save azat/9a9560bfddef36f7701023cafb7a778e to your computer and use it in GitHub Desktop.
Save azat/9a9560bfddef36f7701023cafb7a778e to your computer and use it in GitHub Desktop.
/// clang++ -O2 -g3 -isystem /src/ch/clickhouse/contrib/boost -fsanitize-memory-track-origins -fsanitize=memory test-msan-3.cpp -o test-msan-3; MSAN_OPTIONS='abort_on_error=1 poison_in_dtor=1' ./test-msan-3
/// clang++ -O2 -g3 -fsanitize-memory-track-origins -fsanitize=memory test-msan-3.cpp -o test-msan-3; MSAN_OPTIONS='abort_on_error=1 poison_in_dtor=1' ./test-msan-3
#include <boost/container/small_vector.hpp>
#include <algorithm>
template <class T, std::size_t N,
typename Allocator = boost::container::new_allocator<T>>
using small_vector = boost::container::small_vector<T, N, Allocator>;
struct Foo
{
std::string i;
bool operator<(const Foo &rhs) const { return i < rhs.i; }
};
void foo()
{
small_vector<Foo, 10> vector;
vector.reserve(3);
for (size_t i = 0; i < 3; ++i)
vector.push_back(Foo{});
std::sort(vector.begin(), vector.end());
}
int main()
{
foo();
return 0;
}
==31659==WARNING: MemorySanitizer: use-of-uninitialized-value
#0 0x5555555f64be in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_dispose() /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/bits/basic_string.h:231:6
#1 0x5555555f64be in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/bits/basic_string.h:658:9
#2 0x5555555f64be in Foo::~Foo() /tmp/test-msan-3.cpp:8:8
#3 0x5555555f64be in void boost::container::allocator_traits<boost::container::small_vector_allocator<Foo, boost::container::new_allocator<void> > >::priv_destroy<Foo>(boost::move_detail::integral_constant<bool, false>, boost::container::small_vector_allocator<Foo, boost::container::new_allocator<void> >&, Foo*) /src/ch/clickhouse/contrib/boost/boost/container/allocator_traits.hpp:394:11
#4 0x5555555f64be in void boost::container::allocator_traits<boost::container::small_vector_allocator<Foo, boost::container::new_allocator<void> > >::destroy<Foo>(boost::container::small_vector_allocator<Foo, boost::container::new_allocator<void> >&, Foo*) /src/ch/clickhouse/contrib/boost/boost/container/allocator_traits.hpp:322:7
#5 0x5555555f64be in boost::container::dtl::disable_if_trivially_destructible<Foo*, void>::type boost::container::destroy_alloc_n<boost::container::small_vector_allocator<Foo, boost::container::new_allocator<void> >, Foo*, unsigned long>(boost::container::small_vector_allocator<Foo, boost::container::new_allocator<void> >&, Foo*, unsigned long) /src/ch/clickhouse/contrib/boost/boost/container/detail/copy_move_algo.hpp:972:7
#6 0x5555555f64be in boost::container::vector<Foo, boost::container::small_vector_allocator<Foo, boost::container::new_allocator<void> >, void>::~vector() /src/ch/clickhouse/contrib/boost/boost/container/vector.hpp:1116:7
#7 0x5555555f624c in boost::container::small_vector_base<Foo, boost::container::new_allocator<Foo> >::~small_vector_base() /src/ch/clickhouse/contrib/boost/boost/container/small_vector.hpp:413:4
#8 0x5555555f5f77 in foo() /tmp/test-msan-3.cpp:21:1
#9 0x5555555f6155 in main /tmp/test-msan-3.cpp:25:5
#10 0x7ffff7a8cb24 in __libc_start_main (/usr/lib/libc.so.6+0x27b24)
#11 0x5555555751fd in _start (/tmp/test-msan-3+0x211fd)
Memory was marked as uninitialized
#0 0x5555555d112b in __sanitizer_dtor_callback (/tmp/test-msan-3+0x7d12b)
#1 0x5555555f623a in boost::container::small_vector_base<Foo, boost::container::new_allocator<Foo> >::~small_vector_base() /src/ch/clickhouse/contrib/boost/boost/container/small_vector.hpp:413:4
SUMMARY: MemorySanitizer: use-of-uninitialized-value /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/bits/basic_string.h:231:6 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_dispose()
Exiting
Aborted (core dumped)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment