본문 바로가기

CERT C/표현식

[CERT C/표현식] (5) NULL 체크의 중요성

의미

NULL은 포인터 변수잘못된 주소를 가리키지 않도록 위험성이 없는 0 번지 주소를 가지고 있어서 초기화를 하는 데 많이 쓰이곤 한다.

 

문자열과 포인터를 배워오면서 NULL의 개념에 대해서는 헷갈릴 수 밖에 없다.

NULL 문자 ( \0 ), NULL pointer ( NULL ), NULL string ( "" )의 차이점에 대해서도 알아보자.

  표기 설명
NULL 문자 "\0" 문자열의 끝을 의미하는 문자로 아스키 코드 값 '0'이다. 
NULL pointer NULL 0 번지를 의미하며 대부분 플랫폼에서 Read-Only 영역이나 예약 영역으로 보호받는 주소이다. 그러므로 잘못된 주소를 가리키지 않도록 위험성이 없는 0번지 주소를 가르키도록 초기화를 하는 것이다.
NULL string  "" 아무것도 들어있지 않은 빈 문자열을 의미한다. 그리고 이 문자열은 NULL 문자 하나만 들어가 있다.
NULL 문자는 크기를 가지고 있기 때문에 빈 문자열은 메모리 공간을 할당받는다.
*** 아무것도 들어있지 않다고 크기와 공간이 없는 것이 아님

동작 방식

int* ptr = NULL;

ptr 포인터 변수가 아직 다른 주소를 가리키기 전에 NULL(0번지)를 가리키면서 비정상적인 동작을 하지 않도록 방지한다.

문제 코드 1. 널 포인터가 역참조 되지 않음을 보장하라.

출력을 예상해보기

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 256

int main()
{
    char *address;

    address = (char *)malloc(sizeof(char) * BUF_SIZE);

    printf("주소 입력 : ");
    fgets(address, BUF_SIZE, stdin);
    
    printf("%s\n", address);
}

출력 : 이 프로그램은 보통 출력에 이상이 없을 것이다. 하지만 다른 프로그램에서 위와 같은 방식으로 작성하면 오류를 찾아 한참을 떠날 수가 있다.

취약점 분석 및 해결 코드 1

분석 

 

1. address 포인터 변수가 malloc을 통해서 메모리를 할당 받았다. 이전 포스팅에서 함수의 반환 값에 대해서 이야기 했는데 malloc의 메뉴얼 중 RETURN VALUES 부분은 다음과 같다.

동적 할당 할 수 있는 메모리가 있다면 포인터 변수가 할당 받은 메모리의 첫번째 위치를 가리키게 될 것이고

동적 할당 할 수 있는 메모리가 없다면 NULL 포인터를 가리키게 될 것이다.

 

즉, NULL 포인터를 받게된 것을 체크하지 않고 그대로 프로그램을 진행하면 보호되어 있는 0번지 주소를 참조하려고 하면서 에러가 나게 된다. NULL 포인터 역참조가 일어나면서 에러가 나게 된다.

 

해결 방법 : NULL 체크

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 256

int main()
{
    char *address;

    address = (char *)malloc(sizeof(char) * BUF_SIZE);

    if(address == NULL)
    {
        perror("Dynamic Allocation Fault\n");
        exit(1);
    }
    
    printf("Input Address : ");
    fgets(address, BUF_SIZE, stdin);
    
    printf("%s\n", address);
}

※ NULL 체크를  통해서 NULL 포인터 역참조를 방지하고 프로그램 디버깅을 쉽게 할 수 있도록 한다. 

POINT

  • NULL 문자, NULL 포인터, NULL 스트링의 차이점과 각 각에 대해서 이해한다.
  • 메모리를 할당 하는 경우에 반드시 널 체크를 해준다.

참조


Rec. 03. Expressions (EXP)

 

 

wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=87151976