程序崩溃:缓冲区溢出

来源:互联网 发布:java网上商城 编辑:程序博客网 时间:2024/05/21 18:33

也是从公开课学到的,作了些笔记,现在在实习的机房,靠回忆顺便和大家分享,笔记在宿舍的电脑里,回去再补上。

seg failure:

bus failure:  (这个我不清楚,网上也查了些资料,不怎么清楚)

 

一个程序:

void foo()

{

    int i;

    int array[4];

    for(i=0;i<=4;++i)

        array[i]=0;

}

这段程序会一直无限循环,因为array[4]的地址和i的地址一样的,也就是当第四次循环后,i=3,然后循环执行,++i;即array[4]=0即把 i 地址处的值为4覆盖成为0。

然后执行++i,成功又执行,一样这样下去。其实这造成了缓冲区溢出了。

在栈中,地址是由高往低增长的,那么i的地址(即array[4]的地址)在array[3]上面,array[0]在最下面。可以自己测试打印出他们的地址。

 

另一个:

void foo()

{

    int i;

    short array[4];

    for(i=0;i<=4;++i)

        array[i]=0;

}
这个程序如果在大尾端机器中则不会出现问题。

如果在小尾端机器中则会出现和上面的问题是一样的:死循环

另一个:

void foo()

{

    int array[4];

    int i;

    for(i=0;i<=4;++i)

        array[i]-=4;

}

假设array[i]的初始值都为0;

那就不会造成上面的情况,但是会造成这个函数foo会被执行n次,这是因为如果有一个函数failure调用了foo,那么failure的下一条指令的地址进入saved pc

然后就call <foo>  这样 因为每次执行array[4]-=4;使得saved pc中的值减去4,即又指向了call <foo>,又调用了foo函数,所以这个函数foo会一直执行下去。

感觉和上面一段代码差不多。。

 

其实这些错误的程序可以自己动手调试一下,打印出他们的信息,可以研究下,能学到好多的东西的。

如果有不正确的地方,欢迎提出来,这样也可以改正,谢谢。