【问题标题】:What will be output of simple C function and why?简单 C 函数的输出是什么,为什么?
【发布时间】:2013-12-12 12:08:57
【问题描述】:

我需要理解和重现(用另一种语言) 以下功能的逻辑(C代码) 我真的不明白,它在做什么

double __thiscall sub_1(int this) {

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

}

编译正常,但运行.exe文件时崩溃

我对 C 一点儿都不强,也查不出来, 这组操作数在做什么实际操作 * (双倍的 *) 这不是取消引用,因为没有声明指针。

无论如何,谁能告诉我 - 函数的输出是什么

对于 sub_1(2),为什么?

【问题讨论】:

  • 你确定这是确切的功能吗?这没有意义。
  • 这个问题最好ReverseEngineering.SE。你那里是对原始代码的粗略反编译,是不正确的。
  • @DCoder 好一个;我没有看到那个。所以this 可能是一个包含 12 个字节的东西和一个双精度的结构的地址。
  • 输入 this = 2 >> SIGSEGV
  • @MrLister: 是的,它可能是一个通过ecx 获取结构指针的函数,但__thiscall 通常意味着它是一个C++ 成员函数(它是由 Visual C++ 编译)。

标签: c operand


【解决方案1】:

要使此代码正常工作,int this 必须是一个保存地址整数值的变量。从那个地址,必须有一个有效的双分配,有一个 12 字节的偏移量。代码返回那个双精度的内容。

所以如果函数被调用为sub_1(0x00000010),那么必须在address 0x0000001C 分配一个double 变量。否则,程序会调用未定义的行为,并且很可能会崩溃并烧毁。

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

【讨论】:

  • es,这段代码是收到的反编译代码的一部分,对我来说也没有多大意义。我实际上想了解的是 - 操作数序列正在做什么,而不涉及关于 __thiscall 等的无用讨论:* (double *) (i) // where i - is int 一步一步 * (i) 正在对 int i 执行 ?? 并且具有 @ 类型987654330@ 值为?? ( double *) - 正在执行?? 并且结果是类型??和价值??? ` * (double * ) (i)` 的最终结果是 ?? 类型和 ?? 的值你能帮我把缺失的信息而不是 ?? 请。
  • @user3095293: * (double *)(i)i 的值解释为double *,然后尝试取消引用它。这通常是一个坏主意,因为不能保证i 与指针的大小相同,或者将其视为一个指针是有意义的。正如我们试图告诉您的那样,在您的代码中,sn-p this 不是int,而是void *(实际上,指向某种结构的指针,该结构的double 从第12 个字节开始) .
猜你喜欢
  • 2022-10-05
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 2022-08-13
  • 2018-02-08
  • 1970-01-01
  • 2017-08-10
  • 2018-02-11
相关资源
最近更新 更多