void类型指针强转后发生诡异偏移

先上代码,操作系统centos6.5,gcc版本4.4.7 20120313,纯C代码

int EvoSdtpImsiMIExt(void *arg, void *user)
{
    (void)user;
    EvoCallInfo *evi = (EvoCallInfo *)arg;
    uint32_t imsi_len   = EvoSdtpFieldsGetBCD(evi, 0, imsi);
}

EvoCallInfo是一个自定义的结构体,在外部malloc了一块内存,通过void指针进行函数传递,在EvoSdtpImsiMIExt再强转回EvoCallInfo,然后再用该指针调用EvoSdtpFieldsGetBCD函数,然后在EvoSdtpFieldsGetBCD中使用该结构。
那么问题来啦
在EvoSdtpFieldsGetBCD函数中一调用EvoCallInfo指针程序就挂掉了
然后定位了问题产生的原因,问题出现在EvoCallInfo evi = (EvoCallInfo )arg;这一句上,将void类型的arg指针强专成EvoCallInfo类型的evi时,指针变量值发生诡异的位移,每次都向前位移了0x50个字节
下图是gdb调试信息,堆栈位于EvoSdtpImsiMIExt函数
在这里插入图片描述

在EvoSdtpFieldsGetBCD堆栈中,如果使用函数传进来的指针程序就挂掉,强行查看正确地址内存数据并没有问题
下图是gdb调试信息,堆栈位于EvoSdtpFieldsGetBCD函数
在这里插入图片描述

变量evi和eci有一个错误输入,大家忽略这个细节

如果不用中间变量中转,直接使用arg调用函数就没问题,下面是可以运行的代码

int EvoSdtpImsiMIExt(void *arg, void *user)
{
    (void)user;
    uint32_t imsi_len   = EvoSdtpFieldsGetBCD((EvoCallInfo *)arg, 0, imsi);
}

一直想不通为什么会产生这个bug,指针在进行强转的时候还会发生偏移?大家有没有遇到过类似的问题?请大家帮忙分析一下问题产生的原因

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木千

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值