의미
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
'C, C++ > 표현식' 카테고리의 다른 글
[CERT C/표현식] (4) 함수 반환 값의 중요성 (0) | 2021.01.29 |
---|---|
[CERT C/표현식] (3) 포인터 연산 수행의 중요성 (0) | 2021.01.29 |
[CERT C/표현식] (2) 단축 평가 방식의 중요성 (0) | 2021.01.28 |
[CERT C/표현식] (1) 연산자 우선순위의 중요성 (0) | 2021.01.25 |