最近我在读aarch64的一些汇编代码,发现了这个奇怪的构造函数,它似乎没有在basic_string中定义:
_ZNSt4__n112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2B6v15004IDnEEPKc
拆解后的名字是:
std::__n1::basic_string<char, std::__n1::char_traits<char>, std::__n1::allocator<char> >::basic_string[abi:v15004]<decltype(nullptr)>(char const*)
这个函数可能对给定的
this
指针不执行任何操作。
因为在汇编中我发现
x8
寄存器是用来存储指针的,它是由这个函数构造的,并且在ret
之前被破坏。
但是后来在调用者中,这个x8被用在
operator=(std::string&, std::string&&)
中,看来这会导致use after free错误。
这看起来很奇怪,所以有人能告诉我这个函数是做什么的吗?这个函数只能由编译器生成吗? (意味着用户无法编写此代码)
如果我尝试直接使用它,我会收到此错误:
context.cpp:11:61: error: cannot call constructor ‘std::__cxx11::basic_string<char>::basic_string’ directly [-fpermissive]
11 | std::basic_string<char>::basic_string<decltype(nullptr)>(name);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
它是
std::string(nullptr)
的重载,但请注意,从 C++23 开始显式删除此构造函数
https://en.cppreference.com/w/cpp/string/basic_string/basic_string
basic_string( std::nullptr_t ) = delete; // (since C++23)