2012-06-19 4 views
1

현재 프로세스에 포인터가 매핑되어 있는지 확인하기위한 더러운 해킹은 access 시스템 호출에 대한 포인터를 전달하는 것입니다. 에 대해 errno을 확인하십시오. 다른 하나는 munlock을 사용하고 ENOMEM을 확인하는 것입니다. 다른 하나는 /proc/PID/maps을 구문 분석하는 것입니다. procfs에 의존하지 않고 부작용이 적은 메소드가 있습니까?포인터가 현재 프로세스에 매핑되는지 확인

+1

왜 내가 필요한지 물어봐도 될까요? 너 뭐하려고? – Wug

+2

예, 그가 무엇을하는지 듣는 것은 재미있을 것입니다. –

+0

Fortran과 같은 인수의 유형이나 수를 확인하지 않는 언어의 발신자가있는 도서관에서 가장 일반적인 문제 중 하나는 사용자 우리에게 나쁜 포인터를줍니다. 이것은 대개 사용자가 코드에서 버그를 찾고 수정하는 방법을 설명하는 요청을 지원합니다. 디버그 모드가 더 정확한 검사를 수행하여 사용자 코드에서 더 많은 버그가 더 빨리 발견 될 수 있기를 바랍니다. (valgrind를 사용하는 데 필요한 문서 및 오류 메시지는 충분하지 않습니다. – Jed

답변

1

포인터에 대한 액세스를 확인하는 방법은 단순히 포인터를 사용하려고 시도하는 것입니다. 액세스 권한이없는 경우 SIGSEGV를 수신하게됩니다. SIGSEGV는 자신의 신호 처리기로 catch 할 수 있습니다.

이렇게하려면 포인터에 액세스하기 전에 setjmp() 함수를 사용하고 신호 처리기를 longjmp()으로 설정해야합니다. 이것은에,에서 특정 지점 에서 setjmp() 기능을 다시 시작하려면 응용 프로그램을하게됩니다

... 
longjmp(jmp_buf, 1); 

:이 라인을 따라 뭔가 :하는 신호 처리기에서

if (setjmp(jmp_buf)) printf("The pointer was inaccessible.\n"); 
else { 
    int x = *ptr; 
    printf("The pointer was readable.\n"); 
} 

, 당신은 할 것 방식으로 모든 레지스터를 복원하고 함수가 1 (기본값 : 0 대신)을 반환하도록합니다.

관련 문제