2

私はこれが何をするのか疑問に思っています:

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変数に割り当てられている場合、それがtrueの場合、この場合はどうなりますか。

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

それは実際には条件ではありません...

4

1 に答える 1

3

これはHex-RayのIDA用逆コンパイラプラグインから出力されたと思いますが、正しいですか?これは、std::stringクラスのコンストラクターの呼び出しを表示する方法です。v109はインスタンスを保持するためにスタックに割り当てられたメモリstd::stringであり、2番目のパラメータはインスタンス"hello world"を初期化するための文字列です。

複数の条件が同じ結果のコードにつながる場合、コンパイラーは、生成されたバイトコードのサイズを最小化するために、前の条件からの(同等の)コードフラグメントを再利用することを選択することがよくあります。Hex-Rayの逆コンパイラプラグインは、バージョン1.5までのコンマ演算子を使用してそれらを表示することがよくあります。新しいバージョンの逆コンパイラは、このような状況をよりよく理解しています。

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;
于 2012-09-27T14:39:14.640 に答える