MSVC编译含_Atomic float的代码触发Debug断言(Invalid memory order)的问题咨询
MSVC编译含_Atomic float的代码触发Debug断言(Invalid memory order)的问题咨询
大家好,我最近在用MSVC(版本19.37.32822.0)编写包含原子浮点变量的代码时遇到了问题,运行程序直接触发Debug断言,提示“Invalid memory order”,错误定位在vcruntime_c11_atomic_support.h的第417行。
我的代码如下:
static _Atomic float testf; void func() { testf = 1.0f; float f = testf; printf("%f\n", f); }
我对x64调用约定不算太熟悉,但查看生成的汇编代码后,发现编译器生成的指令似乎没有正确调用_Atomic_store32和_Atomic_load32这两个内部函数。先给大家看一下这两个函数的声明:
inline void _Atomic_store32(volatile int* _Ptr, int _Desired, int _Order); inline int _Atomic_load32(const volatile int* _Ptr, int _Order);
对应的汇编代码是这样的:
; 41 : testf=1.0f; mov r8d, 5 ; !!This seems to be _Order, corresponding to _Atomic_memory_order_seq_cst movss xmm1, DWORD PTR __real@3f800000 lea rcx, OFFSET FLAT:testf call _Atomic_store32 ; !!Where is EDX? That should contain _Desired. ; 42 : float f=testf; movss xmm1, DWORD PTR __real@40a00000 lea rcx, OFFSET FLAT:testf call _Atomic_load32 ; !!EDX should have _Order. movss DWORD PTR f$[rsp], xmm0
能明显看到,调用_Atomic_store32时,本该传递_Desired参数的EDX寄存器完全没被设置;调用_Atomic_load32时,也没在EDX里传入_Order参数。
现在我有点困惑,到底是MSVC的C11原子操作支持存在bug,还是我自己的代码写法哪里出错了?希望有懂这块的朋友能帮忙解答一下,谢谢!
备注:内容来源于stack exchange,提问作者TrayMan
相关产品推荐
相关产品推荐

