You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码`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的误报,你的代码不存在实际的未初始化内存使用问题:

  1. to_string(1)和to_string(2)都会返回完全初始化的std::string对象,所有内部成员都符合C++标准的初始化要求。
  2. 字符串加法operator+处理的是合法的右值引用,操作逻辑完全合规,没有访问未初始化内存的行为。

报错中提到的ref.tmp是编译器在O2优化级别下生成的临时栈变量,MemorySanitizer错误地将其标记为未初始化,但实际上该变量的生命周期和初始化逻辑都符合标准,不会导致未定义行为。

这类问题属于MemorySanitizer与GCC标准库(libstdc++)的已知兼容性问题,官方已确认是误报,后续工具或标准库更新会修复该类问题。

内容的提问来源于stack exchange,提问作者D.J. Elkind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 16:06:28