2

我的测试代码如下:

#include <string>
#include <iostream>


int main()
{
  std::string mylongstring("This is a test string");
  std::cout << mylongstring << std::endl;
}

我使用 GCC 7.2 工具链使用最新的 clang 进行编译。
clang++ -fsanitize=memory msan.cp

这本质上是一个问题的重现器,我看到尝试将内存清理程序集成到在 centos 7 服务器上运行的大型软件堆栈中。

这个小示例代码会产生以下错误:

Uninitialized bytes in __interceptor_fwrite at offset 0 inside [0x702000000000, 21)
==34234==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x7f2acebbd9f3 in std::basic_streambuf<char, std::char_traits<char> >::sputn(char const*, long) /build/*----*/build-gcc710/x86_64-pc-linux-gnu/libstdc++-v3/include/streambuf:451
    #1 0x7f2acebbd9f3 in void std::__ostream_write<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) /build/*----*/build-gcc710/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/ostream_insert.h:50
    #2 0x7f2acebbd9f3 in std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) /build/*----*/build-gcc710/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/ostream_insert.h:101
    #3 0x4ab06d in main (/home/*----*/intelhackathon/a.out+0x4ab06d)
    #4 0x7f2acdbcdc04 in __libc_start_main (/lib64/libc.so.6+0x21c04)
    #5 0x41b323 in _start (/home/*----*/intelhackathon/a.out+0x41b323)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /build/*----*/build-gcc710/x86_64-pc-linux-gnu/libstdc++-v3/include/streambuf:451 in std::basic_streambuf<char, std::char_traits<char> >::sputn(char const*, long)
Exiting

但是,这只发生在 centos 服务器上,在我的本地 arch linux 系统上尝试此操作时,我没有看到任何错误并且它按预期工作。

服务器详情
glibc : 2.17-196.el7
uname -a::
Linux servername 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

我基本上没有想法,所以很乐意为我提供任何帮助,甚至是我可以尝试的建议。

谢谢!:)

4

0 回答 0