我有一个我正在尝试逆向工程ia32 assembly
的程序的代码。c
在一种方法中,它似乎有一行"sscanf(input_phrase, "%d %c %d", ebp-4, ebp-9, ebp-8);"
(假设 input_phrase 是一个c
字符串并且ebp
是一个指针)。鉴于一个 char 是 16 位,它存储 char 的空间应该与它存储第二个 int 的空间重叠(并且通过测试我发现是这种情况)。是否对这段代码应该如何工作有一个精确的定义,或者它是否不可预测?
问问题
239 次
3 回答
2
实际问题的答案是“它没有”——我不完全确定规范是否提到它,但我 100% 确定它scanf
没有“哦,这与它重叠,所以我会做不同的东西”-您只会得到未定义的行为。尝试这样的事情的结果是完全不可预测的[它很可能只是导致最后读取的内容覆盖了第一次读取时重叠的内容——但它也可能导致崩溃或第三次世界大战爆发!]
幸运的是,显示的代码没有调用该行为,因为char
C 中的 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 回答