2013-09-11 2 views
-6

다음은 정의되지 않은 동작을 이해하는 프로그램입니다. 10 * 4 = 40 바이트의 메모리로 ptr을 할당하려고하는데 액세스하려고하므로 40 바이트를 초과하면 * (ptr + 0x100) 일 때 seg 오류가 발생합니다. 코드에서 관찰되는 것은 * (ptr + 0xc000)에 seg fault를 준다. 그것이 힙의 크기를 초과 할 때 seg fault를 주는가? ptr이 할당 된 40 바이트의 경계를 벗어난 ptr + 100에 액세스하려고 시도 할 때 seg fault가 발생하지 않는 이유는 무엇입니까?힙 영역을 넘어서 액세스하려고하는 포인터

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

main() 
{ 
     int * ptr = malloc(10 * sizeof(int)); 

     *ptr = 0x100; 
     printf(" Done 1\n"); 

     *(ptr+0x9) = 0x90; 
     printf(" Done 2\n"); 

     *(ptr+0x100) = 0x400; 
     printf(" Done 3\n"); 

     *(ptr + 0x1000) = 0x4000; 
     printf(" Done 4\n"); 

     *(ptr + 0x4000) = 0x4000; 
     printf(" Done 5\n"); 

     *(ptr + 0x8000) = 0x8000; 
     printf(" Done 6\n"); 

     *(ptr + 0xc000) = 0xc000; 
     printf(" Done 7\n"); 
} 
+5

* "정의되지 않은 동작과 손상을 이해하려고 시도합니다."* 그런 다음 ""그러면 다음과 같은 오류가 발생합니다. "*. "정의되지 않은"이란 의미가 무엇인지 이해하지 못했습니다. 여기에는 거의 이해할 수 없습니다. UB를 호출합니다. 즉, 프로그램이 정의되지 않은 상태로 남아있게됩니다. 물론 이것을 테스트하여 특정 컴파일러가하는 것을 확인할 수는 있지만 그게 전부입니다. 게다가, 귀하의 게시물에 하나의 물음표가 없습니다. 여기에는 의문의 여지가 없습니다. 그러나 수천 개의 질문이 이것에 이미 정신이 일치합니다. –

+2

'int * ptr'을 얻기 전에 이미 오류가 발생했습니다 ... –

+1

다른 것들은 제쳐두고 (많은 사람들이 이미 정의되지 않은 것을 말했습니다) - 당신이 아닌 메모리 페이지에 액세스 할 때 segfault를 얻게됩니다. 페이지가 malloc에 ​​할당 된 것이 아닙니다. 비록 mmap()되어 있어도 (다른 곳에서 할당 될 수 있음을 보장하지는 않지만) 각 페이지는 요청한 40b가 아닌 4kb입니다. – keltar

답변

1

유효한 malloc'ed 위치를 벗어난 힙에 쓸 경우 동작이 정의되지 않습니다. segault가 발생할 수도 있고 그렇지 않을 수도 있습니다. 힙 위치에있는 것과 프로그램의 나머지 부분에서 사용되는 방법에 따라 다릅니다.

프로그램이 전혀 실패하지 않을 수 있습니다. 그러나 프로그램이 오래 걸리면 결국 힙이 손상되어 문제가 발생합니다. 문제를 찾기가 어렵습니다.

1

아시다시피 프로그램에서 을 정의하지 않은 동작을 호출합니다. 정의되지 않음은 "모든 상황에서 segfault가 보장됨"을 의미하지 않습니다. 정의되지 않음은 "C 컴파일러의 준수 구현이 어떤 작업도 수행하는 프로그램을 출력 할 수 있음"을 의미합니다. 정의되지 않은 행동을 이해에

0

시도하지 마십시오, 그것은 정의되지 않은 호출의 요점은 분명히 아무것도이 발생할 수 있음을 확인하는 것입니다.

실제로 UB의 가장 귀찮은 측면은 때때로 작동한다는 것입니다. 적어도 일관되게 실패하면, 전체 클래스의 버그가 결코 필드를 강타하지 않을 것입니다.

UB를 이해하려고하면 고양이 (또는 전직 여자 친구)를 이해하려고하는 것과 같습니다. 라고 생각하면으로 분류 되겠지만 그 다음에 그들은 당신을 켤 것입니다 :-)

이해하기보다는 피하는 것이 좋습니다.

+0

고양이 전시회 UB ?! 이것은 내가 가지고있는 고양이에 관한 모든 것을 설명합니다 ... – nneonneo

+0

물론, 합리적인 유형이되고, 개 사람입니다 :-) – paxdiablo

+0

여기에 있습니다. 나는 친구를 위해 고양이를 돌보고 거의 미쳤다. :) – nneonneo

관련 문제