公司的某嵌入式项目中,我负责写中间业务层接口,会调用到驱动层提供接口。更换新的芯片时,驱动程序有变化,运行程序后出现segment fault. 写驱动的同事排查久久不得结果。我拿到驱动程序后,进行分析。是在类型强转时,没有考虑到类型所占的字节数。由小字节数的类型转成了大字节类型后,进行加法运算而引发segment fault。
伪代码如下:
//业务层调用驱动层接口,驱动层封好后,进行适配
bool Send(..., unsigned char* retBuf, unsigned char* retLen, ....)
{
//这是驱动层真正的入口,注意为图方便,同事直接把char 强转成了size_t
CMD_Send(..., retBuf, (size_t*)retLen, ....);
}
//CMD_Send中的操作
bool CMD_Send(..., unsigned char* buf, size_t* len, ....)
{
//一些操作....
len += 5; //运行到此出错
//一些操作....
}
由于项目需要,适配层接口不变动,而驱动封装前期,没关注老接口,所以适配接口时发现类型不一致,而使用强转的方法。
总结:C语言使用参数作为输出时,实际上传入的是参数的指针地址,在进行加法时,会按强转类型后的内存大小进行内存赋值,而引发segment fault.