1

我有一个我正在尝试逆向工程ia32 assembly的程序的代码。c在一种方法中,它似乎有一行"sscanf(input_phrase, "%d %c %d", ebp-4, ebp-9, ebp-8);"(假设 input_phrase 是一个c字符串并且ebp是一个指针)。鉴于一个 char 是 16 位,它存储 char 的空间应该与它存储第二个 int 的空间重叠(并且通过测试我发现是这种情况)。是否对这段代码应该如何工作有一个精确的定义,或者它是否不可预测?

4

3 回答 3

2

实际问题的答案是“它没有”——我不完全确定规范是否提到它,但我 100% 确定它scanf没有“哦,这与它重叠,所以我会做不同的东西”-您只会得到未定义的行为。尝试这样的事情的结果是完全不可预测的[它很可能只是导致最后读取的内容覆盖了第一次读取时重叠的内容——但它也可能导致崩溃或第三次世界大战爆发!]

幸运的是,显示的代码没有调用该行为,因为charC 中的 a 被定义为大小为 1,因此不存在冲突。

于 2013-03-09T10:05:37.857 回答
1

C 标准以 char 为单位计算大小,因此根据定义,char 的大小为 1。除非您使用一些奇怪的硬件(信号处理器、pdp-10 或类似的硬件),否则这也将对应于正常的, 8 位字节。由于您使用的是 x86 架构,因此您似乎误认为变量是重叠的。

于 2013-03-09T07:40:42.887 回答
0

在 x86 上,char大小为 8 位(1 个字节)。因此,在堆栈上,变量被布置为

CJJJJIIII
         ^ebp

其中I是第一个 int,C是字符,J是第二个 int。没有重叠。

于 2013-03-09T08:05:05.947 回答