我想知道这是做什么的:
std::basic_string<char, std::char_traits<char>, std::allocator<char>>::
basic_string<char, std::char_traits<char>, std::allocator<char>>
(&myText, "hello world");
我的第一个猜测是它将“hello world”分配给myText
变量
如果那是真的那么在这种情况下它会做什么:
if ( v106 == v67 ||
std::basic_string<char, std::char_traits<char>, std::allocator<char>>::
basic_string<char, std::char_traits<char>, std::allocator<char>>
(&v109,"program"), v137 = 1)
{
BYTE3(v95) = 0;
}
这不是一个真正的条件......
答案 0 :(得分:3)
我想这是来自IDA的Hex-Ray反编译器插件的输出,对不对?这是它显示std::string
类的构造函数调用的方式。 v109
是在堆栈上分配的用于保存std::string
实例的内存,而第二个参数"hello world"
是用于初始化它的字符串。
如果多个条件导致相同的结果代码,编译器通常会选择重用先前条件中的(等效)代码片段,以最小化生成的字节码的大小。 Hex-Ray的反编译器插件经常使用Comma-operator版本1.5来显示它们 - 反编译器的新版本有a better understanding of such situations。
if (v106 == v67)
BYTE3(v95) = 0;
std::basic_string<char, std::char_traits<char>,
std::allocator<char>>
::basic_string<char,
std::char_traits<char>,
std::allocator<char>>(&v109,"program");
v137 = 1;
BYTE3(v95) = 0;
这更像是实际来源。用简单的std::basic_string<...>
声明替换庞大的std::string
构造使其更具可读性。
if (v106 == v67)
BYTE3(v95) = 0;
std::string v109("program");
v137 = 1;
BYTE3(v95) = 0;