2017-10-26 13 views
-4

std libc funcs의 동작을 재현하려고합니다. 긍정적 인 사례 - 확인. 부정적 사례 - 확인 하지만 ... 내 부정적인 경우는 모두 "버스 오류"/ "중단"대신 "seg fault"를줍니다.seg 오류, 버스 오류, 중단

예 :

void func() 
{ 
    ... 
    char str[3] = "nvm"; 
    char str2[3] = "nbd"; 
    my_strcat(str, str2); 
    ... 
} 

로봇 $> 세그먼트 오류가 ./ex

void func() 
{ 
    ... 
    char str[3] = "nvm"; 
    char str2[3] = "nbd"; 
    strcat(str, str2); 
    ... 
} 

로봇 $> 중단 ./ex

그래서 "독방 감금 오류가"와 "중단"DIFF 무엇 ? 어떻게하면 코드를 "중단"시킬 수 있습니까?

+1

중복 된 문자열 찾기 : 문자열 리터럴 수정. 더 나쁜 것은'strcat'을 허용하는 메모리가 충분하지 않다는 것입니다. 2 개의 특정 오류 - 포인터의 배열이 아니라'char'의 배열이어야하며, [크기] 제한은 컴파일러가 자동으로' '\ 0' '문자열 종결자를 추가하지 못하게하므로 모든 문자열 처리 함수가 실패합니다. –

+0

코드가 변경되었습니다. * 실제 * 코드를 게시하십시오. 의견이나 대답을 부적절하게 변경하지 마십시오. [Minimal, Complete, Verifiable example] (http://stackoverflow.com/help/mcve)에 대해 읽어보십시오 - 이것은 동적 인 코드 - mod 사이트가 아닙니다. –

+0

내 잘못, ofc 문자 배열. 그러나 나는 어쨌든 충돌 행동에 관해 이야기하고있다. 왜 libc func은 "abort"를주고 libmy func는 "seg fault"를 주는지? –

답변

1

"내 코드를 어떻게 중단 할 수 있습니까?"쉬운 대답 : stdlib.h에 정의 된 abort 함수를 호출하십시오.

"libc func [give] me 'abort'와 libmy func [give] me 'seg fault'"에 대한 답변도 간단합니다. 두 경우 모두 라이브러리 기능에 잘못된 조작; C 라이브러리에는이 잘못된 연산 자체를 감지하는 코드가 있으며 abort; 코드가 오류를 감지하지 않으므로 대신 하드웨어이 "메모리 보호"위반으로이를 트래핑하여 운영 체제에서 치명적인 "세그먼트 오류"신호를 생성합니다.

내가 무엇 수 없습니다 "libmy func"만드는 방법입니다 C 라이브러리를 수행하는 방법입니다. ISO C 또는 POSIX에서 그렇게 할 수있는 방법이 없기 때문입니다. (Win32에서는 방법이 있을지 모르지만 그게 무엇인지는 모르겠다. Windows를 사용한다면 세그먼테이션 오류에 대해 이야기하지 않을 것이다.) 실제로 C 라이브러리 이 아닐 것이라고 주장한다. 왜냐하면 여기에 들어가기에는 너무 복잡한 이유 때문에, POSIX를 넘어서는 운영 체제 확장이 있더라도 C 라이브러리가 수행 한 검사가 정확하지 않기 때문입니다. 더 나은 것은 메모리 보호 하드웨어에 맡겨야합니다. 최소한 하드웨어가 오탐 할 필요는 없습니다.

덧붙여 수년 동안 "세그먼트 오류"(SIGSEGV)와 "버스 오류"(SIGBUS) 사이에는 의미있는 차이가 없었습니다. 응용 프로그램 코드는 그 코드를 동등한 것으로 간주해야하며 둘 중 하나에서 복구를 시도해야하는 경우 (대부분의 코드는 시도하지 않아야 함) 두 경우 모두 동일한 복구 코드를 사용해야합니다.