gpt4 book ai didi

c - C 到底在哪些场景下会抛出段错误?

转载 作者:行者123 更新时间:2023-11-30 19:25:40 26 4
gpt4 key购买 nike

我知道在访问数组越界的情况下:

int arr[2]; 
arr[3] = 10;

C 将在运行时抛出段错误(核心转储)

但是,C 不会检查其他内容(例如 strcpy())的越界访问。

我想确切地知道哪些情况会导致段错误,哪些情况不会。

最佳答案

访问任何不属于您的内存都是未定义的行为。这仅仅意味着 C 标准根本不需要编译器做任何事情来处理这种情况。

由于 C 致力于成为一种高效的语言,因此编译器很少(曾经?)会发布提供对此类事物的运行时检查的机器代码。如果在编译时检测到违规,它们可能会也可能不会发出警告或错误。

其本质是:在运行时收到的任何错误消息(包括段错误)通常来自操作系统。在较旧的系统/操作系统上,甚至在今天的较小(嵌入式)系统上,这种内存管理曾经/不可用,并且内存访问违规可能会使整个系统崩溃,可能是在原始违规发生很长时间后。或者什么也不会发生。或者甚至是更阴险的事情,例如数据损坏。

因此,很高兴拥有现代操作系统虚拟内存管理系统的安全网,但不要依赖它们来防止编程错误造成更大的损害,或者首先检测此类错误。

您还应该尝试使用 valgrind 等工具,它为您的程序提供大量运行时分析和错误检测;通过这种方式可以学到很多东西。

顺便说一句:正如 selbie 在评论中指出的那样,您的代码可能会覆盖函数的堆栈帧或激活记录的一部分。其原因是大多数机器上的堆栈向下增长(新内存分配在较小的地址处),但数组索引向上移动。许多编译器都包含使用“堆栈金丝雀”进行编译的选项,它可以检测运行时中的堆栈损坏。这是开发和测试期间非常有用的功能,并且还提供了一些针对试图利用此类缓冲区溢出的恶意软件的防御措施。

关于c - C 到底在哪些场景下会抛出段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58534007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com