2017-12-20 5 views
-1

그럼 비트 연산에 대해 배우기 때문에이 오류의 원인을 알 수 없습니다. 내가 봤 거든이 오류가 스택을 망친하거나, 어떤 경우에는 CPU 아키텍처와 관련이있을 때 발생할 수있는 것으로 보인다. 도움이 될 다른 플래그로 컴파일을 시도했지만 작동시키지 못합니다.(C++) 비트 OR 연산시 "잘못된 명령어 (코어 덤프 됨)"오류가 발생합니다.

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); 
} 

그리고 오류 "잘못된 명령 (코어 덤프)"라인 여기

corners |= (material << i);

에서 일어나고있는 디버거의 출력입니다 :

여기에 신속하게 코드의

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

이 출력의 결과를 알려 드리겠습니다. oop (결코 첫 번째 루프를 지나치지 않게). 여기 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] 

내가 크게 사람이 왜 이런 일에 대해 말해 줄 수있는 통찰력을 고맙게 생각하고, 명확한 이유가있는 경우 , 문제를 해결하는 방법.

감사합니다.

+0

플랫폼 (컴파일러 versikon, OS, IDE)이 무엇입니까? [MCVE]를 제공 할 수 있습니까? –

+0

런타임에 비트 OR 연산에 문제가있는 것은 드문 경우입니다. 문제를 [mcve]로 줄이고 게시하십시오. –

+0

'Density_Func' (vec3 (cornerPos)) 호출을 somme 더미 상수로 대체하여'Density_Func'가 호출되지 않은 경우에도 여전히 크라 샤가 발생하는지 확인하십시오. –

답변

3

"잘못된 명령어"는 CPU가 이해하지 못하는 명령어를 실행하려고했음을 의미합니다. 이것은 CPU가 지원하지 않는 명령 세트로 프로그램을 컴파일 할 때 발생할 수 있습니다. 이 장소의 충돌은 BMI2 비트 시프트 명령이 사용되었음을 암시합니다 (AVX2를 지원하는 CPU에서 지원됨). 편집 옵션을 확인하십시오.

또 다른 가능성은 프로그램이 일부 코드를 덮어 썼다는 것입니다. 스택과 다른 메모리 영역에 위치하므로 상황이 엉망이됩니다. 나는 이것이 여기의 경우가 아니라고 생각한다.

이것은 잠재적으로 과열 또는 일부 CPU 버그로 인해 발생할 수도 있지만 이러한 원인은 여기에서도 대부분 제외 될 수 있습니다. 컴파일러에서 발생할 수있는 버그와 동일합니다.