预期或意外的分段错误?
Expected or unexpected Segmentation errors?
我正在从事代码安全方面的工作。所以下面讨论的代码是已知的易受攻击的。
我想明白为什么运行下面的代码没有分段错误
#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 段或数据段)。
这是 https://en.wikipedia.org/wiki/Code_segment
中描述的流程结构
我正在从事代码安全方面的工作。所以下面讨论的代码是已知的易受攻击的。
我想明白为什么运行下面的代码没有分段错误
#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 段或数据段)。
这是 https://en.wikipedia.org/wiki/Code_segment
中描述的流程结构