cdecl调用约定中栈16字节对齐源于bug?该bug具体指什么
cdecl调用约定强制16字节对齐的bug根源
- 这个问题的核心是微软Visual C++编译器的实现漏洞:早期cdecl调用约定仅要求栈按4字节(32位环境)或8字节(64位环境)对齐,但当编译器开始支持SSE、AVX这类SIMD指令后,被调用函数里如果用这些指令访问栈上的16字节对齐变量,必须依赖栈处于16字节对齐状态。
- 但编译器生成调用cdecl函数的代码时,未正确计算栈帧的偏移量,导致调用者发起函数调用前,栈指针的位置无法保证16字节对齐,直接引发被调用函数里的SIMD指令因对齐错误崩溃。
- 微软没有修复编译器的对齐计算bug,反而直接修改了cdecl的规范,强制要求所有调用者在调用前必须把栈对齐到16字节,用这种方式规避崩溃问题。
内容的提问来源于stack exchange,提问作者jinreal
相关产品推荐
相关产品推荐

