ida Hex-Rays 的 C++ 伪代码中的 COERCE_FLOAT 是什么?

逆向工程 艾达 C++ 漂浮
2021-06-22 03:39:56

我正在倒车,然后我找到了 COERCE_FLOAT 的定义:

float v28;
float v29;

v29 = COERCE_FLOAT(&v30);
v28 = COERCE_FLOAT(&v31); // what is this?

我搜索并 发现 它是一种简单的转换方法,但真的像在 C++ 中一样吗?

v30 的值在没有指针的情况下传递给 v29?我不明白。

2个回答

我认为这只是一个简单的演员表。

v29 = *reinterpret_cast< float* >( &v30 );

如果您共享生成的程序集而不是伪代码会更容易。

这可能只是像 WasserEsser 所说的简单演员表。我在尝试反编译 q_rsqrt 函数时遇到了这种相同类型的强制转换。您可能可以通过使用强制转换来重新创建相同类型的行为,就像 WasserEsser 建议的那样,但您可能也可以使用联合,例如在此代码中:

float Q_rsqrt( float number )
{
    union {
        float f;
        uint32_t i;
    } conv;

    float x2;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    conv.f  = number;
    conv.i  = 0x5f3759df - ( conv.i >> 1 );
    conv.f  = conv.f * ( threehalfs - ( x2 * conv.f * conv.f ) );
    return conv.f;
}

然后反编译为:

float __stdcall Q_rsqrt(float a1)
{
  return (flt1Point5
        - a1
        * flt0Point5
        * COERCE_FLOAT(0x5F3759DF - (SLODWORD(a1) >> 1))
        * COERCE_FLOAT(0x5F3759DF - (SLODWORD(a1) >> 1)))
       * COERCE_FLOAT(0x5F3759DF - (SLODWORD(a1) >> 1));
}