首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存清除器报告在全局对象构造中使用未初始化的值。

内存清除器报告在全局对象构造中使用未初始化的值。
EN

Stack Overflow用户
提问于 2020-02-06 14:31:54
回答 2查看 1.2K关注 0票数 5

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

代码语言:javascript
复制
#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;
}

这是我得到的警告:

代码语言:javascript
复制
==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

这是假阳性还是正在发生什么事?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-06 15:22:30

这可能已经被报道为MemorySanitizer bug https://github.com/google/sanitizers/issues/542

然而,它是以状态WontFix结束的,没有太多的解释。

您似乎需要构建工具化的C++标准库,以避免出现错误。来自MemorySanitizer维基

如果希望MemorySanitizer正常工作而不产生任何误报,则必须确保您的程序和它使用的库中的所有代码都是插装的(即用-fsanitize=memory构建的)。特别是,您需要链接到MSan工具化的C++标准库。我们建议为此目的使用libc++。

票数 2
EN

Stack Overflow用户

发布于 2020-02-06 14:51:48

这是假阳性还是正在发生什么事?

这要么是清除器中的假阳性,要么是标准库实现有错误。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60097307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档