我正在研究代码安全性。因此,下面讨论的代码容易受到攻击。
我想了解为什么运行下面的代码没有细分错误
#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]);
}
如前所述,当你访问超出范围的内存时,你将调用未定义的行为。根据你的情况,未定义的行为可能会使程序崩溃(如4,000的值)并可能打印任意值(如400的值)。
我假设当尝试打印4,000个整数的数组时,你到达了不应用于数据的内存(例如,程序文本段),而当你使用400个整数的数组时,你仍处于堆栈区域(或堆) ,bss段或数据段)。