basic_string分配器

时间:2012-09-27 14:21:02

标签: c++ reverse-engineering

我想知道这是做什么的:

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;
  }

这不是一个真正的条件......

1 个答案:

答案 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;