2014-03-05 2 views
3

나는 메모리를 읽는 것이 원인이 안에게메모리를 읽는 중 세그먼트 오류가 발생합니까?

char *d=""; 
char *d2="test"; 
memcmp(d,d2,10); 

예를 들어, 어떤 문제는 memcmp()이 실패 할 수 있다고 생각?

+0

memcmp (0,0,10) is segfault ... 포인터 매개 변수가 프로그램의 유효한 메모리를 가리키는 것으로 가정합니다. – amdn

+1

@ amdn, "will"에 대해서는 확신이 없습니다. 왜냐하면 동작은 다소 정의되지 않았기 때문입니다. –

+0

@ s.bandara 맞아, 정의되지 않은 행동이지만, 내가 아는 모든 시스템에 결함이있다. – amdn

답변

5

프로세스의 주소 공간에 매핑되지 않은 주소에서 메모리를 읽는 것은 SEGV이되므로 올바르지 않습니다. 특히 주소 0 (거의 모든 아키텍처에서) 읽기 및 커널 메모리 공간 읽기 (심지어 매핑 된 경우), 일반적으로 물리적 메모리가 읽을 수있는 것으로 매핑 된 논리 메모리 읽기.

예에서 할당되지 않은 바이트에 memcmp을 실행 중입니다. 이는 정의되지 않은 동작입니다. 스택 또는 데이터 세그먼트에서 가비지를 읽지 만 알 수있는 방법이 없습니다. 예를 들어, d이 스택의 맨 위에있을 수 있으므로 스택의 맨 위로 넘어 가서 매핑되지 않은 메모리로 이동할 수 있습니다 (스택은 일반적으로 아래쪽으로 커집니다).

+0

"스택 또는 데이터 세그먼트의 가비지를 스택의 맨 위에 올릴 수 있습니다."- 'd'가 어디 있는지는 중요하지 않습니다. 'memcmp()'의 결과와 같습니다. 위험한 'd'에 저장된 주소 - 스택 상에 없을 문자열 리터럴로 설정된 것을 알 수 있습니다 - 전통적으로 데이터 세그먼트에 있습니다. –

+0

"d"에 대한 메모리가 읽기 전용 섹션에 할당되고 Tony가 말한 것처럼 함수 스택에 할당되지 않습니까? –

+0

'd'는 포인터 ('char *')이므로'd' 자체는 읽기 전용이 아닙니다. 'd'가 가리키는 데이터는 읽기 전용 메모리에 위치하거나 쓰기 가능한 영역에있을 수 있습니다. 이것이 어디에 있는지, 쓰기가 가능한지에 대해서는 아무런 보장이 없으며, 컴파일러가 스택의 맨 위에 (예를 들어) 놓는 것을 막을 수있는 방법이 없습니다. 요점은 그것 이상의 독서는 정의되지 않는다는 것입니다. – abligh