2011-10-09 3 views
1

C에서 버퍼 크기를 어떤 제한없이 오류없이 해결할 수있는 이유는 무엇입니까 (세그멘테이션 오류)? 내가 어떤 오류없이 23 개 문자 대신에 10 자까지 인수로 통과 할 수 있었다버퍼 크기를 초과합니까?

#include <stdio.h> 
#include <string.h> 

void function1(char *a) { 
    char buf[10]; 
    strcpy(buf, a); 
    printf("End of function1\n"); 
} 

main (int argc, char *argv[]) { 
    function1(argv[1]); 
    printf("End of main\n"); 
} 

,하지만 난 24 개 문자를 사용할 때 내가 얻을 : 예를 들어

,이 코드로 연주했다 세그멘테이션 오류.

나는 24 번째 문자로, 나는 반환 값에 도달했다는 것을 알고있다. 그러나 이전의 13 일은 어떨까요 ?? !!

답변

3

오류가 발생했습니다. 버퍼 크기를 초과하고 끔찍한 일이 없습니다. Naively, 당신이 버퍼를 초과 할 때 어떤 끔찍한 일이 일어나야합니다. 예상했던 것, 오류의 정의는 발생하지 않았습니다.

나는 경박하지 않으려 고합니다. 내 요점은 심각한 것입니다. 규칙을 어기면 무슨 일이 일어날 지 모릅니다. 오류가 발생할 수 있습니다. 그것은 좋게 보일지도 모른다. 다른 일이 일어날 수 있습니다. 원칙적으로 예측할 수 없습니다. 컴파일러에서 컴파일러, 운영 체제 또는 운영 체제로 변경되거나 실행되도록 실행할 수도 있습니다.

이 경우에는 buf이 스택의 마지막 항목이고 공백이 중요한 항목에 사용되지 않은 것 같습니다. 이후 공간의 일부를 사용하면 무해합니다. 결국 중요한 구조를 공격하거나 쓰기가 불가능한 페이지에 충돌하여 오류가 발생할 수 있습니다.

1

미정의 동작의 장점입니다.

C를 들어
  • , 배열 외부에 작성하는 것은 매핑되지 않은 주소 또는 잘못된 권한 (읽기 전용)로 매핑 된 주소로 작성, 불법 운영 체제에 대한
  • 불법입니다

어떤 과정이 허용되는지에 대한 아이디어는 항상 완벽하게 일치하는 것은 아닙니다.

C 프로그램이 완전히 정상적인 작동과 구별되기 때문에 OS가 "나와 함께 괜찮아"라고 말하는 완전히 뇌 손상을 입을 가능성은 완벽합니다.

질문으로 돌아가서 처음 13 바이트가 실제로 유효한 페이지에 쓰여졌을 가능성이 있습니다. 다음 바이트는 아마도 읽기 전용 메모리 나 맵핑되지 않은 주소를 건드렸고 OS는 오류를 발견 할 기회를 가졌습니다.

관련 문제