代码`string s=std::to_string(1)+std::to_string(2)`是否触发MemorySanitizer误报?
这是MemorySanitizer的误报,并非实际未初始化内存使用
问题场景
以下是触发报错的代码与构建配置:
main.cpp
#include <string> #include <iostream> using namespace std; int main() { string s0 = to_string(1); cout << "s0: " << s0 << endl; string s1 = to_string(1) + to_string(2); cout << "s1: " << s1 << endl; return 0; }
Makefile
main: clang++ -fsanitize=memory -fsanitize-memory-track-origins -fPIE -pie -fno-omit-frame-pointer -g -O2 main.cpp -o main-msan.out clang++ -O2 main.cpp -o main.out
运行报错信息
./main-msan.out s0: 1 ==122092==WARNING: MemorySanitizer: use-of-uninitialized-value #0 0x55a7354e5cf7 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/basic_string.h:6123:34 #1 0x55a7354e5cf7 in main <my_directory>/msan/main.cpp:9:30 #2 0x7f201f6edd09 in __libc_start_main csu/../csu/libc-start.c:308:16 #3 0x55a735468349 in _start (<my_directory>/msan/main-msan.out+0x21349) Uninitialized value was created by an allocation of 'ref.tmp' in the stack frame of function 'main' #0 0x55a7354e4d90 in main <my_directory>/msan/main.cpp:6 SUMMARY: MemorySanitizer: use-of-uninitialized-value /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/basic_string.h:6123:34 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&) Exiting
结论与分析
这是MemorySanitizer的误报,你的代码不存在实际的未初始化内存使用问题:
to_string(1)和to_string(2)都会返回完全初始化的std::string对象,所有内部成员都符合C++标准的初始化要求。- 字符串加法
operator+处理的是合法的右值引用,操作逻辑完全合规,没有访问未初始化内存的行为。
报错中提到的ref.tmp是编译器在O2优化级别下生成的临时栈变量,MemorySanitizer错误地将其标记为未初始化,但实际上该变量的生命周期和初始化逻辑都符合标准,不会导致未定义行为。
这类问题属于MemorySanitizer与GCC标准库(libstdc++)的已知兼容性问题,官方已确认是误报,后续工具或标准库更新会修复该类问题。
内容的提问来源于stack exchange,提问作者D.J. Elkind
相关产品推荐
相关产品推荐

