-
#include <stdio.h>
-
-
int main()
-
{
-
int i;
-
int a[2];
-
a[2]=5;
-
printf("%d\n", i);
-
return 0;
-
}
上述代码用gcc编译之后执行程序,发现会报如下错误:
-
5
-
*** stack smashing detected ***: ./程序名 terminated
-
Aborted (core dumped)
查阅资料发现这是因为gcc编译时默认提供一种函数栈的保护机制stack-protector,如果函数栈出现越界访问的情况就会触发该机制。使用如下编译命令可以关掉该保护机制
-
gcc -o 程序名 -fno-stack-protector 程序名.c
使用该命令编译之后执行程序,发现程序可以正常执行完,并不会报告异常,但i的值已经被更改为5了。所以数组访问越界并不会触发段错误的产生。
我们对代码再做修改,如下:
-
#include <stdio.h>
-
-
int main()
-
{
-
const int i;
-
int a[2];
-
//a[2]=5;
-
i = 6;
-
printf("%d\n", i);
-
return 0;
-
}
编译时会报错对只读变量赋值,无法编译成功。
再把代码修改如下:
-
#include <stdio.h>
-
-
int main()
-
{
-
const int i=1;
-
int a[2];
-
a[2]=5;
-
printf("%d\n", i);
-
return 0;
-
}
会发现i的值被改为5了。
该现象说明如下3点:
1 修改const值只会在编译时检查;
2 const变量可以在运行时被意外修改;
3 数组越界并不会引发段错误。
目前仅发现给空指针赋值时会引发段错误。
阅读(2099) | 评论(0) | 转发(0) |