programing

malloc failure는 어떻게 감지합니까?

css3 2023. 10. 12. 23:27

malloc failure는 어떻게 감지합니까?

다음을 확인할 수 있는 휴대용 방법은 무엇입니까?malloc0이 아닌 메모리 블록을 할당하지 못했습니까?

싱글 유닉스 사양에 따르면,malloc돌아올 것입니다NULL그리고 세트errno실패했을 때는

저는 항상 이렇게 합니다.

tok = malloc( sizeof( char ) * ( strlen(tc) + 1 ) );

if( tok == NULL )
{
     /* Malloc failed, deal with it */
}

어떤 분들은.tok = (type) malloc( ... )하지만 결과물은 분명히 몇 가지 끔찍한 오류들을 덮고 있기 때문에 당신은 그 결과를 캐스팅해야 합니다.제가 조사를 좀 해서 정확히 어떤 것들인지 알아낼 수 있는지 알아보겠습니다.

편집:

malloc을 캐스팅하면 실종자를 숨길 수 있습니다.#include <stdlib.h>

아주 좋은 설명을 담고 있는 이 링크를 찾았습니다.

http://cboard.cprogramming.com/faq-board/25799-faq-casting-malloc.html

"그래서 당신이 이 말을 할 때 (char*)malloc(10)

당신은 malloc이 반환하는 것은 무엇이든 가져가서 char*로 변환하고 그것을 문제의 변수에 할당한다는 것입니다.

malloc을 적절히 프로토타입화한다면(stdlib.h를 포함하여), 여기서 void 반환으로 정의됩니다*.

stdlib.h를 포함하지 못했을 때 문제가 발생하며 컴파일러는 처음에 malloc가 int를 반환한다고 가정합니다.진짜 문제는 컴파일러로부터 어떤 경고도 받지 못한다는 것입니다.

그런 다음 즐겁게 그것을 (캐스트를 통해) 차로 바꿉니다.(char*)의 크기와 (int)의 크기가 다른 컴퓨터에서는 코드가 심각하게 끊어집니다.

이제 char *var = malloc( 10 )만 있고 include를 놓치면 컴파일러로부터 경고를 받게 됩니다."

다음과 같은 경우 장애를 감지할 수 있습니다.

malloc(n)돌아온다NULL

이 테스트는 할당 실패를 탐지하는 가장 일반적이고 신뢰할 수 있는 테스트입니다.POSIX/SUS 이상의 휴대성을 원한다면 신뢰할 수 없습니다.errno그래도.자세한 정보가 필요하다면, 로깅을 위해, 나는 0일 것입니다.errno전화하기 전에, 변경되었는지 확인하고, 기록해 두십시오.

malloc(n)non-turns 를 반환합니다.NULL실제 메모리로 백업되지 않는 주소

만져보고 OS에 의해 죽는지 확인해보세요.네, 이럴 수도 있습니다.메모리 오버 커밋이라고 하며, 부분적인 지급준비금 은행과 유사합니다.이것은 OS나 하이퍼바이저가 실제 제공할 필요가 전혀 없는 도박을 하고 있는 가상 메모리에 주소를 반환하는 최적의 접근 방식입니다.는 Linux, VMware에서 발생합니다.(요청된 페이지는 터치 시에만 "커밋"되지만 Windows(윈도우) 오버 커밋에 대한 명확한 증거를 찾을 수 없습니다.)

그렇다면 질문은 "10대의 짝사랑처럼 이전에 신뢰했던 malloc에서 얻은 주소에 액세스할 때 프로그램이 충돌하려고 할 경우 어떻게 휴대용으로 감지할 수 있습니까?"입니다.가지 방법은 테스트 영역에 랜덤 파일을 넣고 운영 체제가 EINVAL 또는 동등한 것을 반환하는지 확인하는 것입니다.

추가적인 포인트는.

malloc(0)sNULL그리고 나뭇잎들errno

"0이 아닌 [크기의] 메모리 블록"을 묻는 질문은 알고 있지만 흥미롭습니다.다음을 반환하려는 SUS 호환 할당자를 고려합니다.NULL의 경우할 수 ) 실패하므로 우음)다를 .NULL을 시도할 도 있습니다.errno 실패한 건가요?Hoare는 우리가 이 모호함 때문에 10억 달러를 지불했다고 말하는 것 같습니다.서에게 ,malloc(0)휴대용은 아니고 질문자는 아마 그것을 알고 있었을 것입니다!

으로 이죠 입니다. 휴대용 방법은 만약malloc(...)sNULL.

malloc(n)sNULL실패로 해서
malloc(0) 돌아올지도 모릅니다NULL.

고장 탐지 방법:

void* ptr = malloc(n);
if (ptr == NULL && n > 0) Handle_Failure();

주의:

"... memory "... allocate non-zero block", "... allocate non-zero memory block" 처럼 같은 가 종종 .0할 수 e0테스트는 필요없습니다.

size_t nstr = strlen(some_string) + 1;
void* ptrstr = malloc(nstr);
if (ptrstr == NULL) Handle_Failure();

은 를 설정합니다.errno전부는 아니지만 실패한 경우에세팅errno메모리 할당 실패로 인해 C11 사양에 지정되지 않았습니다.

malloc(n)sn되지 않은 esize_t. int n음의 값을 가지면 분명히 큰 부호 없는 값으로 변환되고 나서 메모리 할당에 실패할 가능성이 높습니다.

언급URL : https://stackoverflow.com/questions/6325940/how-detect-malloc-failure