Chinaunix首页 | 论坛 | 博客
  • 博客访问: 186208
  • 博文数量: 37
  • 博客积分: 171
  • 博客等级: 入伍新兵
  • 技术积分: 315
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-13 22:54
个人简介

寻找方向程序猿、攻城狮

文章存档

2023年(1)

2022年(4)

2019年(1)

2018年(1)

2017年(1)

2015年(2)

2014年(19)

2013年(2)

2012年(1)

2011年(5)

分类: C/C++

2022-01-25 16:26:22


  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int i;
  5.         int a[2];
  6.         a[2]=5;
  7.         printf("%d\n", i);
  8.         return 0;
  9. }

上述代码用gcc编译之后执行程序,发现会报如下错误:

  1. 5
  2. *** stack smashing detected ***: ./程序名 terminated
  3. Aborted (core dumped)
查阅资料发现这是因为gcc编译时默认提供一种函数栈的保护机制stack-protector,如果函数栈出现越界访问的情况就会触发该机制。使用如下编译命令可以关掉该保护机制

点击(此处)折叠或打开

  1. gcc -o 程序名 -fno-stack-protector 程序名.c
使用该命令编译之后执行程序,发现程序可以正常执行完,并不会报告异常,但i的值已经被更改为5了。所以数组访问越界并不会触发段错误的产生。
我们对代码再做修改,如下:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         const int i;
  5.         int a[2];
  6.         //a[2]=5;
  7.         i = 6;
  8.         printf("%d\n", i);
  9.         return 0;
  10. }
编译时会报错对只读变量赋值,无法编译成功。
再把代码修改如下:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         const int i=1;
  5.         int a[2];
  6.         a[2]=5;
  7.         printf("%d\n", i);
  8.         return 0;
  9. }

会发现i的值被改为5了。
该现象说明如下3点:
1 修改const值只会在编译时检查;
2 const变量可以在运行时被意外修改;
3 数组越界并不会引发段错误。

目前仅发现给空指针赋值时会引发段错误。



阅读(2099) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~