首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么下面的代码不会在windows上产生“分割错误”?

为什么下面的代码不会在windows上产生“分割错误”?
EN

Stack Overflow用户
提问于 2011-04-05 11:19:39
回答 1查看 152关注 0票数 1
代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <string.h>

void bad() {
    printf("Oh shit really bad~!\r\n");
}

void foo() {
    char overme[4] = "WOW";
    *(int*)(overme+8) = (int)bad;
}

int main() {
   foo();
}

在32位linux下,它会产生分割错误,但在windows not.Why?

EN

回答 1

Stack Overflow用户

发布于 2011-04-05 11:24:59

因为未定义的行为就意味着:未定义。未定义但将导致错误,但未定义,这意味着任何事情都可能发生。

有时,任何事情都可能是它按预期工作。当然,这并不是一件好事,因为对于新的编译器、操作系统或运行时库,甚至基于星期几或月相,它可能会停止按预期工作。

ISO标准规定了一个定义良好的程序将如何运行,他们没有要求一个未定义的程序将如何运行,只是说它可以做任何它喜欢做的事情。

对于特定的情况,您必须检查由编译器生成的汇编器代码,以了解为什么它没有丢弃您的堆栈。有可能Linux在你覆盖的位置存储了一段相当重要的信息(比如来自main的返回地址),而Windows存储了一些相对良性的信息(比如来自main的返回代码)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5546823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档