2013-12-12 39 views
1

我需要理解和再现(另一种语言)以下功能(C代码)的 逻辑 ,我真的不明白,简单C函数的输出是什么,为什么?

double __thiscall sub_1(int this) { 

    return * (double *) (this + 12); 

} 

它编译OK它是做什么的,但坠毁运行时.exe文件

我不是强以C可言,而且不能找出来, 什么实际操纵该组操作数是做 *(双*) 这不是一个解引用,因为没有声明指针。

无论如何,谁能告诉我 - 会是怎样的功能

为sub_1输出(2)为什么?

+1

您确定这是确切的功能吗?这没有意义。 –

+2

这个问题在[ReverseEngineering.SE](http://reverseengineering.stackexchange.com/)中会更好。你有什么是原始代码的粗略反编译,这是不正确的。 – DCoder

+1

@DCoder好的一个;我没有看到。所以'this'可能是一个包含12个字节的东西和一个double的结构的地址。 –

回答

3

要使此代码生效,int this必须是一个保存地址整数值的变量。从该地址开始,必须有一个有效的双重分配,并有12个字节的偏移量。该代码返回该double的内容。

因此,如果函数被调用为sub_1(0x00000010),那么必须有一个双变量分配在address 0x0000001C。如果没有,程序调用未定义的行为,很可能会崩溃&刻录。

请注意,使用int传递地址没有任何意义。一个更好的选择应该是double*,或者至少是uint32_t这不是一个有符号的整数类型。如果地址太大而无法放入int中,该代码将失败。

+0

es,这个代码是接收到的反编译代码的一部分,它没有什么意义我也是。 我实际上试图理解的是什么序列的操作数正在做,而不会进入无用的讨论__thiscall等: *(double *)(i)//其中我 - 是int' 步骤通过步骤 '*(i)'正在对'int'进行'??'操作,并且具有一个'??'值''' '(double *)' - 正在执行'''并且结果是类型?和价值? '*(double *)(i)'最终的结果是'''''类型'的值和''' 请问你能帮我把丢失的信息,而不是'''请。 – user3095293

+0

@ user3095293:'*(double *)(i)'将'i'的值解释为'double *',然后尝试对其进行解引用。这通常是一个坏主意,因为不能保证'i'与指针的大小相同,或者将它看作一个指针是合理的。正如我们试图告诉你的那样,在你的代码片断中,this不是一个int,而是一个void *(实际上,指向从第12个字节开始有一个double的结构的指针)。 – DCoder