Linux栈空间及栈地址方向

写了个简单程序,可以让linux的栈空间耗尽,然后出现core dumped,即栈溢出

代码如下:

#include <stdio.h>
void overFlow()
{
    long i;
    printf("&i  : %p\n",&i);
    overFlow();
}


int main()
{
   overFlow();
}

运行程序 ./out > out.log

栈地址是从高到低,所以用第一个减去最后一个地址,就能得到栈空间

我用python算出

$python

>>> (0x7fffe4c974cc - 0x7fffe449be2c)*1.0/1024/1024
7.982086181640625

可见是8M

使用ulimit -s可得到8192, 与程序结果一致

overFlow如下填写也能core dumped

void overFlow()
{
    char i0[1024*1024*2] = {0};
    char i1[1024*1024*2] = {0};
    char i2[1024*1024*2] = {0};
    char i3[1024*1024*2] = {0};
    char i[1024*1024*2] = {0};
    printf("&i  : %p\n",&i);
}


此外,说下局部变量入栈的顺序,代码:

int main()
{
    int a;
    char s1[1024] = {0};
    char s2[1024] = {0};
    char ch1;
    char ch2;
    char* p1, *p2;
    int b, c, d, e ,f;

    printf("&a: %p\n",&a);
    printf("&s1: %p\n",s1);
    printf("&s2: %p\n",s2);
    printf("&ch1: %p\n",&ch1);
    printf("&ch2: %p\n",&ch2);
    printf("&p1: %p\n",&p1);
    printf("&p2: %p\n",&p2);
    printf("&b: %p\n",&b);
    printf("&c: %p\n",&c);
    printf("&d: %p\n",&d);
    printf("&e: %p\n",&e);
    printf("&f: %p\n",&f);

}

该代码在不同的平台有不同的顺序,故不探讨了


判断栈的增长方向及函数参数入栈顺序:

#include <iostream>
void findStackDirection()
{
    static int* addr = NULL;
    int dummy;
    if(addr == NULL)
    {
        addr = &dummy;
        findStackDirection();
    }
    else
    {
       if(&dummy > addr)
       {
           std::cout << "STACK direction: Low -> High" << std::endl;
       }
       else
       {
           std::cout << "STACK direction: High -> low" << std::endl;
       }
    }
}

void func(int a, int b)
{
    if(&b < &a)
    {
        std::cout << "ARGS: left -> right" << std::endl;
    }
    else
    {
        std::cout << "ARGS: right -> left" << std::endl;
    }
}
 
int main()
{
    findStackDirection();
    func(1,2);
}

我的工作系统linux输出为

STACK direction: High -> low
ARGS: left -> right

使用在线编译输出为

STACK direction: High -> low
ARGS: right -> left

可以得出

1. 栈的增长方向均为High -> low

2. 不同的系统参数入栈顺序可能不同,我的工作系统linux上是从左至右,而网上编译器是从右至左



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值