Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 由xatomic.h中的内联汇编代码修改的帧指针寄存器“ebx”_C++_Visual Studio 2012_Boost_Assembly_Atomic - Fatal编程技术网

C++ 由xatomic.h中的内联汇编代码修改的帧指针寄存器“ebx”

C++ 由xatomic.h中的内联汇编代码修改的帧指针寄存器“ebx”,c++,visual-studio-2012,boost,assembly,atomic,C++,Visual Studio 2012,Boost,Assembly,Atomic,好吧,我停下来,看看我遇到过的最晦涩的虫子。我会对几乎完全相同的问题发表评论,但我没有足够的声誉 这个bug的作用是,当程序试图从函数返回时,我的程序试图在不可执行的内存区域执行。执行地址0x00000000时发生访问冲突。 我跟踪了VisualStudio2012的xatomic.h头include'atomic'C++11标准头中发生的错误,该头覆盖了x86内联汇编中的ebx寄存器。一旦发生这种情况,线程的堆栈将被永久破坏 我很清楚这是什么时候发生的。该bug是由boost::lockfre

好吧,我停下来,看看我遇到过的最晦涩的虫子。我会对几乎完全相同的问题发表评论,但我没有足够的声誉 这个bug的作用是,当程序试图从函数返回时,我的程序试图在不可执行的内存区域执行。执行地址0x00000000时发生访问冲突。 我跟踪了VisualStudio2012的xatomic.h头include'atomic'C++11标准头中发生的错误,该头覆盖了x86内联汇编中的ebx寄存器。一旦发生这种情况,线程的堆栈将被永久破坏

我很清楚这是什么时候发生的。该bug是由boost::lockfree::queue::empty函数触发的,并且仅在启用优化的发布版本中。空函数必须由编译器内联到它的调用函数中。该程序在调试模式下运行良好,因为空函数没有内联

我收到许多关于修改ebx寄存器的编译器警告:

"include\boost-1_55\boost\atomic\detail\windows.hpp(1598): warning C4731: 'BuzyStack<JobPool>::push' : frame pointer register 'ebx' modified by inline assembly code"
"include\boost-1_55\boost\atomic\detail\windows.hpp(1598): warning C4731: 'BuzyStack<JobPool>::push' : frame pointer register 'ebx' modified by inline assembly code"
"y:\work\visualstudio\vc\include\xatomic.h(2133): warning C4731: 'ThreadSubSystem::join_pool' : frame pointer register 'ebx' modified by inline assembly code"
"y:\work\visualstudio\vc\include\xatomic.h(2137): warning C4731: 'ThreadSubSystem::join_pool' : frame pointer register 'ebx' modified by inline assembly code"
BuzyStack是我管理线程池的并发“线程池堆栈”。项目可以同时推送到BuzyStack或从BuzyStack弹出

我确实需要boost::lockfree::queue::empty函数,那么如何解决这个问题呢

我已经做的是相当激进的行动。我修改了VisualStudio2012更新4 xatomic.h头{}部分,其中ebx寄存器被覆盖。我强制保存ebx寄存器,方法是在_asm块开始时将其保存到时间变量中,并在_asm块结束时恢复ebx。这很有效。bug已经消失了,但我仍然可以在程序中看到调用堆栈暂时无效的地方。当我进行此更改时,编译器警告的数量也增加了一倍

更新 抱歉,我不清楚这个问题:很快:我如何修复这个bug?我似乎是MSVC编译器的错

我的代码中没有任何内联asm代码。所有警告都是由boost-1.55原子库和无锁库中的代码以及MSVC 2012 xatomic.h头生成的。
标准的header mod只是暂时的解决方法,我不再使用moded header,也不再使用空函数。如果我尝试调用空函数,该错误仍然存在,并会破坏我的堆栈。

我不太确定你在问什么,你是在问如何修复编译器以避免出现此错误?错误应该在别处,你不必更新标准库头。是的,我在问如何修复我的编译器。@Geoffroy我也有这个bug。我要避免它的唯一方法是删除std::atomic的所有用法,其中sizeofT==8。在整个应用程序崩溃之前,现在一切都很顺利!我想换一个新的编译器版本也可以消除这个bug。