Warm tip: This article is reproduced from serverfault.com, please click

c-预期或意外的细分错误?

(c - Expected or unexpected Segmentation errors?)

发布于 2020-12-02 14:46:33

我正在研究代码安全性。因此,下面讨论的代码容易受到攻击。

我想了解为什么运行下面的代码没有细分错误

#include <stdio.h>

int main(){
    int a[3]={0,1,2};
    for (int i=0; i<=400; i++)
      printf("value of a[%d] is %d\n",i, a[i]);      

}

但是运行下面的代码,将循环绑定从400更改为4000,是否存在细分错误?我想知道为什么在一种情况下会出现细分错误,而在另一种情况下却没有。

#include <stdio.h>

int main(){
    int a[3]={0,1,2};
    for (int i=0; i<=4000; i++)
      printf("value of a[%d] is %d\n",i, a[i]);      

}
Questioner
zell
Viewed
11
Eliyahu Machluf 2020-12-02 23:01:35

如前所述,当你访问超出范围的内存时,你将调用未定义的行为。根据你的情况,未定义的行为可能会使程序崩溃(如4,000的值)并可能打印任意值(如400的值)。

假设当尝试打印4,000个整数的数组时,你到达了不应用于数据的内存(例如,程序文本段),而当你使用400个整数的数组时,你仍处于堆栈区域(或堆) ,bss段或数据段)。

这是https://en.wikipedia.org/wiki/Code_segment中描述的流程结构

这是https://en.wikipedia.org/wiki/Code_segment中所述的流程结构