记录一个偶发的死机情况
1. 问题背景
最近的项目中,改动代码时新增了一个结构体,该结构体包含 double 成员,并通过 double 指针进行了取值操作。
2. 代码复现
大致代码如下:
c
/* packed(1)结构体:double成员仅按1字节对齐,value偏移为1,必然不是8字节对齐 */
#pragma pack(1) // 设置对齐值为 1 字节
typedef struct {
uint8_t prefix; /* 偏移0 */
double value; /* 偏移1,未8字节对齐 */
} unaligned_double_struct_t;
#pragma pack() // 恢复默认对齐
void Trigger_Unaligned_Double_Fault(double *p)
{
volatile double val;
/* 对double指针进行取值操作,若地址未8字节对齐则触发异常 */
val = *p;
/* 防止编译器优化 */
(void)val;
}
执行后触发了异常,关键在于该操作并非每次都会执行,因此并非每次必现。
手动模拟异常操作的结果:
