Why does this patch silence an invalid read reported by Valgrind?

Scott Kostyshak skostysh at lyx.org
Tue Mar 22 01:25:32 UTC 2022


Attached is part of a Valgrind log (the full log is 1MB, let me know if
you want to go leak hunting). I was trying to investigate
https://www.lyx.org/trac/ticket/12510. I get the Valgrind message when
opening probability8.lyx on that ticket.

Also attached is a possible patch that fixes this particular invalid
read. However, I have no idea why the unpatched code triggers an invalid
read, nor why the patch would fix it.

Does anyone have an idea?

Scott
-------------- next part --------------
==2365082== Memcheck, a memory error detector
==2365082== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2365082== Using Valgrind-3.17.0 and LibVEX; rerun with -h for copyright info
==2365082== Command: /home/scott/lyxbuilds/master/CMakeBuild/bin/lyx -userdir /home/scott/lyxbuilds/master/user-dir probability8.lyx
==2365082== Parent PID: 2359215
==2365082== 
==2365082== Invalid read of size 32
==2365082==    at 0x617DB5D: __wmemcmp_avx2_movbe (memcmp-avx2-movbe.S:413)
==2365082==    by 0x8EDEF8: std::char_traits<wchar_t>::compare(wchar_t const*, wchar_t const*, unsigned long) (char_traits.h:485)
==2365082==    by 0x90C9B5: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::compare(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const (basic_string.h:2878)
==2365082==    by 0x908D50: _ZStssIwSt11char_traitsIwESaIwEEDTcl21__char_traits_cmp_catIT0_ELi0EEERKNSt7__cxx1112basic_stringIT_S3_T1_EESB_ (basic_string.h:6263)
==2365082==    by 0x909708: std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >::operator()(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const (stl_function.h:386)
==2365082==    by 0xD8F847: std::_Rb_tree<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>, std::_Select1st<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_iterator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (stl_tree.h:2177)
==2365082==    by 0xD8F3CE: std::_Rb_tree_iterator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > std::_Rb_tree<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>, std::_Select1st<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::_M_emplace_hint_unique<std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>, std::tuple<> >(std::_Rb_tree_const_iterator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>&&, std::tuple<>&&) (stl_tree.h:2433)
==2365082==    by 0xD8F143: std::map<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, lyx::(anonymous namespace)::deco_struct, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::operator[](std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (stl_map.h:501)
==2365082==    by 0xD8C26D: lyx::(anonymous namespace)::init_deco_table::init_deco_table() (MathSupport.cpp:536)
==2365082==    by 0xD9065B: __static_initialization_and_destruction_0(int, int) (MathSupport.cpp:541)
==2365082==    by 0xD91B0A: _GLOBAL__sub_I_MathSupport.cpp (MathSupport.cpp:1120)
==2365082==    by 0x60080FC: call_init (libc-start.c:145)
==2365082==    by 0x60080FC: __libc_start_main@@GLIBC_2.34 (libc-start.c:379)
==2365082==  Address 0x8b28cb0 is 0 bytes inside a block of size 28 alloc'd
==2365082==    at 0x4843FB3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==2365082==    by 0x8F1469: __gnu_cxx::new_allocator<wchar_t>::allocate(unsigned long, void const*) (new_allocator.h:127)
==2365082==    by 0x8EF91E: allocate (allocator.h:197)
==2365082==    by 0x8EF91E: std::allocator_traits<std::allocator<wchar_t> >::allocate(std::allocator<wchar_t>&, unsigned long) (alloc_traits.h:460)
==2365082==    by 0x8F1533: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_create(unsigned long&, unsigned long) (basic_string.tcc:153)
==2365082==    by 0x8F112E: void std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_construct<wchar_t*>(wchar_t*, wchar_t*, std::forward_iterator_tag) (basic_string.tcc:219)
==2365082==    by 0x8F061B: void std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_construct_aux<wchar_t*>(wchar_t*, wchar_t*, std::__false_type) (basic_string.h:255)
==2365082==    by 0x8EF5C2: void std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_construct<wchar_t*>(wchar_t*, wchar_t*) (basic_string.h:274)
==2365082==    by 0x8EE7A9: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (basic_string.h:459)
==2365082==    by 0xD9046D: std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, 0ul, >(std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>&, std::tuple<>&, std::_Index_tuple<0ul>, std::_Index_tuple<>) (tuple:1808)
==2365082==    by 0xD904B2: std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>(std::piecewise_construct_t, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>, std::tuple<>) (tuple:1798)
==2365082==    by 0xD902C6: decltype (::new ((void*)(0)) std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>((declval<std::piecewise_construct_t const&>)(), (declval<std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&> >)(), (declval<std::tuple<> >)())) std::construct_at<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>, std::tuple<> >(std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>*, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>&&, std::tuple<>&&) (stl_construct.h:97)
==2365082==    by 0xD90365: void std::allocator_traits<std::allocator<std::_Rb_tree_node<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > > >::construct<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>, std::tuple<> >(std::allocator<std::_Rb_tree_node<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >&, std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>*, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>&&, std::tuple<>&&) (alloc_traits.h:514)
==2365082== 
==2365082== Invalid read of size 32
==2365082==    at 0x617DB59: __wmemcmp_avx2_movbe (memcmp-avx2-movbe.S:412)
==2365082==    by 0x8EDEF8: std::char_traits<wchar_t>::compare(wchar_t const*, wchar_t const*, unsigned long) (char_traits.h:485)
==2365082==    by 0x90C9B5: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::compare(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const (basic_string.h:2878)
==2365082==    by 0x908D50: _ZStssIwSt11char_traitsIwESaIwEEDTcl21__char_traits_cmp_catIT0_ELi0EEERKNSt7__cxx1112basic_stringIT_S3_T1_EESB_ (basic_string.h:6263)
==2365082==    by 0x909708: std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >::operator()(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const (stl_function.h:386)
==2365082==    by 0xD8FC8C: std::_Rb_tree<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>, std::_Select1st<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::_M_lower_bound(std::_Rb_tree_node<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >*, std::_Rb_tree_node_base*, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (stl_tree.h:1903)
==2365082==    by 0xD8F67E: std::_Rb_tree<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>, std::_Select1st<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::lower_bound(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (stl_tree.h:1270)
==2365082==    by 0xD8F2D2: std::map<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, lyx::(anonymous namespace)::deco_struct, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::lower_bound(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (stl_map.h:1259)
==2365082==    by 0xD8F088: std::map<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, lyx::(anonymous namespace)::deco_struct, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::operator[](std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (stl_map.h:497)
==2365082==    by 0xD8C26D: lyx::(anonymous namespace)::init_deco_table::init_deco_table() (MathSupport.cpp:536)
==2365082==    by 0xD9065B: __static_initialization_and_destruction_0(int, int) (MathSupport.cpp:541)
==2365082==    by 0xD91B0A: _GLOBAL__sub_I_MathSupport.cpp (MathSupport.cpp:1120)
==2365082==  Address 0x8b28f50 is 0 bytes inside a block of size 28 alloc'd
==2365082==    at 0x4843FB3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==2365082==    by 0x8F1469: __gnu_cxx::new_allocator<wchar_t>::allocate(unsigned long, void const*) (new_allocator.h:127)
==2365082==    by 0x8EF91E: allocate (allocator.h:197)
==2365082==    by 0x8EF91E: std::allocator_traits<std::allocator<wchar_t> >::allocate(std::allocator<wchar_t>&, unsigned long) (alloc_traits.h:460)
==2365082==    by 0x8F1533: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_create(unsigned long&, unsigned long) (basic_string.tcc:153)
==2365082==    by 0x8F12F1: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_mutate(unsigned long, unsigned long, wchar_t const*, unsigned long) (basic_string.tcc:307)
==2365082==    by 0x90F206: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_replace_aux(unsigned long, unsigned long, unsigned long, wchar_t) (basic_string.tcc:437)
==2365082==    by 0x90B295: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::append(unsigned long, wchar_t) (basic_string.h:1272)
==2365082==    by 0xA8BA63: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::resize(unsigned long, wchar_t) (basic_string.tcc:377)
==2365082==    by 0xA8A4A5: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::resize(unsigned long) (basic_string.h:958)
==2365082==    by 0x12B26B7: lyx::from_ascii[abi:cxx11](char const*) (docstring.cpp:39)
==2365082==    by 0xD8C257: lyx::(anonymous namespace)::init_deco_table::init_deco_table() (MathSupport.cpp:536)
==2365082==    by 0xD9065B: __static_initialization_and_destruction_0(int, int) (MathSupport.cpp:541)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: silences-valgrind.diff
Type: text/x-diff
Size: 552 bytes
Desc: not available
URL: <http://lists.lyx.org/pipermail/lyx-devel/attachments/20220321/0cdad495/attachment-0001.diff>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.lyx.org/pipermail/lyx-devel/attachments/20220321/0cdad495/attachment-0001.asc>


More information about the lyx-devel mailing list