(C ++)获取错误"非法指令(核心转储)"按位OR运算

时间:2017-12-20 06:27:31

标签: c++ runtime-error c++14 bit-shift bitwise-or

所以,我仍然在学习按位操作,并且无法弄清楚为什么会出现这种错误。我用谷歌搜索了它,看起来这个错误可能发生在搞乱堆栈时,或者在某些情况下,它与CPU架构有关。我尝试使用不同的标志进行编译,这些标志应该有所帮助,但我无法让它工作。

快速找到代码:

int corners = 0;
for (int i = 0; i < 8; i++)
{
    const ivec3 cornerPos = leaf->min + CHILD_MIN_OFFSETS[i];
    const float density = Density_Func(vec3(cornerPos));
    const int material = density < 0.f ? MATERIAL_SOLID : MATERIAL_AIR;
    corners |= (material << i);
}

错误&#34;非法指令(核心倾销)&#34;正在发生在

corners |= (material << i);

这是调试器的输出:

Signal received: SIGILL (Illegal instruction) For program, pid 26,118

我要给出这个循环的输出(它永远不会超过第一个循环)。 这是couts的代码:

int corners = 0;
    std::cout<<"corners(outside loop): "<<corners<<std::endl;

for (int i = 0; i < 8; i++)
{
    const ivec3 cornerPos = leaf->min + CHILD_MIN_OFFSETS[i];
            std::cout<<"cornerPos.x: "<<cornerPos.x<<std::endl;
            std::cout<<"cornerPos.y: "<<cornerPos.y<<std::endl;
            std::cout<<"cornerPos.z: "<<cornerPos.z<<std::endl;

    const float density = Density_Func(vec3(cornerPos));
            std::cout<<"density: "<<density<<std::endl;

    const int material = density < 0.f ? MATERIAL_SOLID : MATERIAL_AIR;
            std::cout<<"material: "<<material<<std::endl;

            std::cout<<"MATERIAL_SOLID: "<<MATERIAL_SOLID<<std::endl;
            std::cout<<"MATERIAL_AIR: "<<MATERIAL_AIR<<std::endl;
            std::cout<<"i: "<<i<<std::endl;

    corners |= (material << i);
            std::cout<<"corners(inside loop): "<<corners<<std::endl;
}

以及输出:

[corners(outside loop): 0] [cornerPos.x: -32] [cornerPos.y: -32] [cornerPos.z: -32] [density: -30] [material: 1] [MATERIAL_SOLID: 1] [MATERIAL_AIR: 0] [i: 0]

我非常感谢有人可以告诉我为什么会发生这种情况,以及如果有明确的理由,如何解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:3)

&#34;非法指令&#34;意味着CPU试图执行不理解的指令。如果使用CPU不支持的指令集编译程序,则可能会发生这种情况。此处崩溃可能表明使用了BMI2位移指令(在支持AVX2的CPU上也支持)。请检查您的编译选项。

另一种可能性是你的程序覆盖了一些代码。它位于与堆栈不同的内存区域,因此事情会非常混乱。我怀疑这不是这种情况。

这可能也可能是由于过热或某些CPU错误造成的,但这些原因最有可能也可以排除在这里。对于编译器中可能存在的错误也一样。