2009-12-12 6 views
0

이 코드로 인해 버스 오류가 발생하는 이유를 알고 싶습니다.SPARC 아키텍처의 C++ 버스 오류

int main() 
{ 
int p=34; 
int *pp= (int *) ((char *)&p+1); 
cout<<*pp<<"\n"; 
return 0; 
} 
+1

정렬 문제 외에도 정의되지 않은 동작입니다. 너는 경계선 밖에서 읽고있다. 결과적으로이 프로그램은 훨씬 더 상상력이 풍부한 방식으로 폭발 할 수 있습니다. – jalf

답변

10

분명히 정렬 문제 일 것입니다. 많은 아키텍처에서 특정 유형을 올바르게 정렬해야합니다 (예 : 4 바이트 정수 이 4 바이트 경계에서 시작해야 함).

정렬되지 않은 데이터에 액세스하는 경우 일부 아키텍처는 신경 쓰지 않고 다른 아키텍처는 느리게 실행되며 나머지는 (예 :이 경우) 비명을 지르는 힙에 빠지게됩니다.

정수 p을 만들면 올바른 배수 인 주소로 스택에 올바르게 정렬됩니다.

해당 주소를 바이트 단위로 이동하고이를 int으로 역 참조하면 SIGBUS이 발생합니다.

This link은 정렬 요구 사항을 보여줍니다. 요약하면 :

  • 짧은 정수는 16 비트 경계에 정렬됩니다.
  • int 정수는 32 비트 경계에 정렬됩니다.
  • 긴 정수는 SPARC 시스템의 64 비트 경계에 정렬됩니다.
  • long long 정수는 64 비트 경계에 정렬됩니다.
+0

덕분에 많은 도움을 받았습니다! 지금 비 정렬 주소가 의미하는 바를 이해합니다. – PJT

1

양의 16 비트 또는 2 바이트 정렬로 저장해야 16 비트 및 32 비트 (4 바이트) 많은 CPU가 정렬되지 않은 액세스를 지원하는 4

의 배수 인 어드레스에서, 홀수 바이트를 집어 내기 위해 여분의 메모리 버스 사이클을 실행하기 위해 칩에 여분의 회로와 추가 실행 시간이 필요합니다. 특히 RISC 프로세서 철학은 컴파일러와 프로그래머가보다 빠른 속도와 단순한 회로를 위해 신중하게 데이터를 배치하는 데 더 많은주의를 기울여야 할 필요가 있다는 것을 보여줍니다.

그런데 그런 낮은 주소가 유효한 메모리에있을 것 같지는 않습니다. 그러나 귀하의 예제에서는 정렬 예외가 SEGFAULT 예외보다 우선 순위가 높음을 보여줍니다.

관련 문제