记录一个诡异的函数调用返回错误的指针bug

本文分析了一种在C语言编程中容易忽视的指针截断Bug:由于函数返回值预留字节不足导致指针被截断。文章通过具体代码示例展示了问题发生的原因,并给出了在头文件中正确声明函数来解决问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//main.c
#include "test.h" void main(){ S* s = get_struct_s(); printf("%s\n",s->name); return 0; }
//test.h typedef struct S_{ ... char name[8]; } S;
S* s_array[10];
//test.c #include "test.h" S* get_struct_s(){
return s_array[0];
}

在大型程序中,复杂的Makefile可能会通过上面这种project(即能够编译成功),但是在执行过程中printf语句会crush,经过gdb定位,是get_struct_s返回了一个错误的指针。但是,这个指针在get_struct_s内部的时候是正确的。例如正确的指针是0xaa12345678,返回之后变成了0xffffffff12345678,经过比较可以明显看出后四个字节是相同的,函数返回时正确的指针被截断为4个字节了。
原因是test.h中没有声明get_struct_s函数,编译器为get_struct_s函数的返回值预留了4个字节,但是实际返回的指针大于4个字节,产生了截断,这种bug很不容易察觉。
解决方法是在test.h中声明函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值