c问题

bug_ex.c

#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <stdio.h>
 
void bug2(void *a,void *b,uint64_t offset,uint64_t size,void *fp,int ver)
{
    printf("fp:%p\n",fp);
}

bug.c

#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <stdio.h>
 
void bug1(void *a,void *b,uint64_t offset,uint64_t size,void *fp,int ver)
{
    printf("fp:%p\n",fp);
}
int main()
{
    void *a = malloc(1);
    void *b = malloc(1);
    void *fp = malloc(1);
    off_t offset = 1;
    size_t size = 1;
 
    bug1(a,b,offset,size,fp,1);
    bug2(a,b,offset,size,fp,1);
 
    free(a);
    free(b);
    free(fp);
    return 0;
}

Makefile

all:bug bug.asm
bug.asm:bug
    objdump -SD bug >bug.asm
bug:bug.o bug_ex.o
    gcc -g -o bug bug.o bug_ex.o
bug.o:bug.c
    gcc -g -D_FILE_OFFSET_BITS=64 -c bug.c
bug_ex.o:bug_ex.c
    gcc -g -D_FILE_OFFSET_BITS=64 -c bug_ex.c
clean:
    rm -f bug.o bug_ex.o bug bug.asm

我在ubuntu11.10,gcc 4.6.1上make编译后执行后

./bug
fp:0x80ea028
fp:0x1

bug.c调用函数bug2时,由于没有函数原型(也就是函数成名)编译器不知道函数的参数的具体类型,就按照实际参数的类型调用函数(也就是把参数入栈)也就是
a,b,offset,size,fp,1
类型为
void *, void *, off_t, size_t, FILE *, int
其中第4个实参的类型(size_t)与形参(int64_t)的类型不一致,在32为系统上
size_t是32位的,调用的时候按32位入栈(少了4字节),所以bug2里取参数fp的时候其实取到的是ver的值(1)

实际压栈情况 取参数情况
----------   ----------
|   a    |   |   a    | 栈顶
----------   ----------
|   b    |   |   b    |
----------   ----------
| offset |   | offset |
----------   ----------
| offset |   | offset |
----------   ----------
| size   |   | size   |
----------   ----------
| fp     |   | size   |
----------   ----------
| ver    |   | fp     |
----------   ----------
| xxxx   |   | ver    |
----------   ----------


调用bug2时栈的状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值