溢出问题

1)数组溢出

在C语言中,数组的元素下标是从0开始计算的,所以,对于n个元素的数组a[n], 遍历它的时候是a[0],a[1],...,a[n-1],如果遍历到a[n],数组就溢出了。
下面的一段代码,数组越界造成死循环,分析下此时栈结构得知arr[i]//i为9时候i被篡改为0 造成死循环

 #include<stdio.h>
int main(int argc, char **argv){
    int i = 0;
    int arr[9];
    int j = 0;
    while(i < 10){
       arr[i] = 0;//当i=9时发生了数组越界,修改i的值为0造成死循环
       ++i;
       printf("z\t");
    }
    return 0;
}

2)缓冲区溢出

缓冲区溢出一般是调用了一些不安全的字符串操作函数比如:strcpy,strcat等(这些字符串操作函数在拷贝或者修改目标位置的时候,并不判断长度是否会超过目标缓存),或者设置参数超过了目标缓存能容纳的大小而造成的溢出问题。

strcpy strncpy  strcat strncat
void func1(char *s){
   char buffer[10];
   /*此时,buffer只有10个字节,如果传入的s超过10个字节,就会造成溢出*/
   strcpy(buffer, s);
}‍

3)栈溢出

栈都是有一定大小限制的。如果在栈上分配的空间大于了这个限制,就会造成栈大小溢出,破坏栈上的数据。比如局部变量过多,或者递归调度嵌套太深都会造成栈溢出。比如:

int func1(void){


   char buffer[2048576]; //buffer[]分配在栈上,但2048576的空间超过了栈的默认大小1M,直接编译报错stack    overflow。

   memset(buffer,0,2048576);

   printf("stack.\n");

   return 0;

}

4)整数溢出

整数的溢出分为下溢出和上溢出。比如,对于有符号的char(signed char)类型来说,它能表示的范围为:[-128,127]之间;而对于无符号的char(unsigned char)来说, 它能表示的范围为:2^8 = 256 = [0,255]。
那么,例如下面的代码:

signed char c1 = 127;

c1 = c1+1;//发生上溢出,c1的值将变为-128

signed char c2 = -128;

c2 = c2-1;//发生下溢出,c2的值将变为127

unsigned char c3 = 255;

c3 = c3+1;//发生上溢出,c3的值将变为0

unsigned char c4 = 0;

c4 = c4-1;//发生下溢出,c4的值将变为255

从上面的例子可以看出,当一个整数向上溢出,将会变为最小值,而向下溢出,将会变为最大值。

转载于:https://my.oschina.net/ZY5277/blog/651945

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值