【问题标题】:Memory sanitizer reports use-of-uninitialized-value in global object constructionMemory sanitizer 报告全局对象构造中未初始化值的使用
【发布时间】:2020-02-06 14:31:54
【问题描述】:

我在执行以下使用clang++-9 -fsanitize=memory 编译的程序时收到use-of-uninitialized-value 警告:

#include <map>

class msan_test
{
  std::map<int, int> m_map;

public:
  msan_test()
  {
    m_map.insert(std::make_pair(1, 1));
    m_map.insert(std::make_pair(2, 2));
  }
};

msan_test gobj; // global object of above class

int main()
{
  return 0;
}

这是我得到的警告:

==16598==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x49898f in std::_Rb_tree<int, std::pair<int const, int>, std::_Select1st<std::pair<int const, int> >, std::less<int>, std::allocator<std::pair<int const, int> > >::_M_get_insert_unique_pos(int const&) (/home/noname/a.out+0x49898f)
    #1 0x49828e in std::pair<std::_Rb_tree_iterator<std::pair<int const, int> >, bool> std::_Rb_tree<int, std::pair<int const, int>, std::_Select1st<std::pair<int const, int> >, std::less<int>, std::allocator<std::pair<int const, int> > >::_M_emplace_unique<std::pair<int, int> >(std::pair<int, int>&&) (/home/noname/a.out+0x49828e)
    #2 0x497a7e in std::enable_if<is_constructible<std::pair<int const, int>, std::pair<int, int> >::value, std::pair<std::_Rb_tree_iterator<std::pair<int const, int> >, bool> >::type std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > >::insert<std::pair<int, int> >(std::pair<int, int>&&) (/home/noname/a.out+0x497a7e)
    #3 0x49785a in msan_test::msan_test() (/home/noname/a.out+0x49785a)
    #4 0x41be52 in __cxx_global_var_init (/home/noname/a.out+0x41be52)
    #5 0x41beb8 in _GLOBAL__sub_I_memsan.cpp (/home/noname/a.out+0x41beb8)
    #6 0x49bcbc in __libc_csu_init (/home/noname/a.out+0x49bcbc)
    #7 0x7f5db517db27 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:266
    #8 0x41bee9 in _start (/home/noname/a.out+0x41bee9)

SUMMARY: MemorySanitizer: use-of-uninitialized-value (/home/noname/a.out+0x49898f) in std::_Rb_tree<int, std::pair<int const, int>, std::_Select1st<std::pair<int const, int> >, std::less<int>, std::allocator<std::pair<int const, int> > >::_M_get_insert_unique_pos(int const&)
Exiting

这是误报还是有深层次的事情发生?

谢谢。

【问题讨论】:

  • 我想这个问题的典型答案是“永远不要使用全局变量”。
  • @idclev463035818 你可以复制它,因为使用了godbolt。 coliru 重现结果:coliru.stacked-crooked.com/a/2f8fbd89d661fb76
  • 我要说这是误报。
  • @BartekBanachewicz 虽然应该避免使用全局变量,但即使您使用本地变量也会触发消毒剂。
  • 这个没有全局变量的较短示例也会生成use-of-uninitialized-value 警告:coliru.stacked-crooked.com/a/26452112448b24fe

标签: c++ constructor clang global msan


【解决方案1】:

这可能已经报告了 MemorySanitizer 错误https://github.com/google/sanitizers/issues/542

但是它没有太多解释就被 Status WontFix 关闭了。

您似乎需要构建已检测的 C++ 标准库以避免误报。来自MemorySanitizer wiki

如果您希望 MemorySanitizer 正常工作并且不产生任何错误 肯定的是,您必须确保程序中的所有代码和 它使用的库是经过检测的(即使用 -fsanitize=memory 构建的)。 特别是,您需要链接到 MSan-instrumented C++ 标准库。为此,我们建议使用 libc++。

【讨论】:

    【解决方案2】:

    这是误报还是有深层次的事情发生?

    这可能是消毒剂中的误报,或者标准库实现存在错误。

    在所示程序中没有读取未初始化的值。

    【讨论】:

    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多