提问者:小点点

libstdc++文件系统中的未初始化用法?


请考虑以下代码:

#include <filesystem>

int main() {
    std::filesystem::path p{"/"};
}

当使用带有标志-std=C++17-fsanitize=memory-g-o1-stdlib=libstdC++的clang10进行编译时,它编译得完全正常,但在运行时,内存清理器发现以下错误:

==166467==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x560e38eafc41 in std::basic_ostream<char, std::char_traits<char> >& std::__detail::operator<<<char, std::char_traits<char>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::basic_ostream<char, std::char_traits<char> >&, std::__detail::_Quoted_string<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char> const&) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../include/c++/10.1.0/bits/quoted_string.h:124:32
    #1 0x560e38eaf03c in std::basic_ostream<char, std::char_traits<char> >& std::filesystem::__cxx11::operator<<<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::filesystem::__cxx11::path const&) /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../include/c++/10.1.0/bits/fs_path.h:441:7
    #2 0x560e38eaecdb in main ~/test/test.cpp:15:15
    #3 0x7f5d0fa58001 in __libc_start_main (/usr/lib/libc.so.6+0x27001)
    #4 0x560e38e3033d in _start (~/test/a.out+0x2133d)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../include/c++/10.1.0/bits/quoted_string.h:124:32 in std::basic_ostream<char, std::char_traits<char> >& std::__detail::operator<<<char, std::char_traits<char>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::basic_ostream<char, std::char_traits<char> >&, std::__detail::_Quoted_string<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char> const&)
Exiting

使用-stdlib=libc++编译时,它的工作完全正常。 另请参阅godbolt(遗憾的是,msan-output在这里有点不可描述)。

记忆消毒剂是过分热心还是出了什么问题? 我简单地看了一下有问题的文件和代码

    for (auto __c : __str._M_string)
      {
        if (__c == __str._M_delim || __c == __str._M_escape) // <- line 124
          __ostr << __str._M_escape;
        __ostr << __c;
      }

我认为可以(__str的类型为std::__detail::_quoted_string,std::allocator>const&,它只有一个用户定义的构造函数,该值从参数初始化所有三个成员)。

clang++-v的输出:

clang version 10.0.0 
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/10.1.0
Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/10.1.0
Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64

共1个答案

匿名用户

这是假阳性。

你应该把它报告为消毒剂虫; 它似乎与第1238期相似。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(libstdc++|文件|系统|中|未|初始化|用法)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?