88. assert
1. 키워드
2. assert
사용하기
assert
매크로는 assert.h
헤더 파일에 정의되어 있으며 정해진 조건에 맞지 않을 때 프로그램을 중단한다.
- 즉,
assert
에 지정한 조건식이 거짓일 때 프로그램을 중단하며 참일 때는 프로그램이 계속 실행된다.
- 단,
NODEBUG
매크로가 정의되어 있으면 assert
는 무시된다.
- 다음과 같이 포인터가
NULL
이면 프로그램을 중단하도록 만들어보자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h> // assert가 정의된 헤더 파일
void copy(char *dest, char *src)
{
assert(dest != NULL); // dest이 NULL이면 프로그램 중단
assert(src != NULL); // src가 NULL이면 프로그램 중단
strcpy(dest, src); // 문자열 복사
}
int main()
{
char s1[100];
char *s2 = "Hello, world!";
copy(s1, s2); // 정상 동작
copy(NULL, s2); // NULL이 들어갔으므로 프로그램 중단
return 0;
}
- 위의 코드를 실행해 보면 프로그램을 중단시킨
assert
의 정보가 표시된다.
copy
함수를 보면 assert(dest != NULL);
과 같이 포인터 dest
가 NULL
이 아니면 프로그램을 계속 실행하도록 만들어져 있다.
void copy(char *dest, char *src)
{
assert(dest != NULL); // dest이 NULL이면 프로그램 중단
assert(src != NULL); // src가 NULL이면 프로그램 중단
strcpy(dest, src); // 문자열 복사
}
assert
의 조건식을 지정할 때는 항상 올바른 상황을 정한다고 생각하면 쉽다.
- 여기서는
strcpy
에 NULL
이 들어가면 안 되므로 assert(dest != NULL);
과 assert(src != NULL);
이 항상 올바른 상황이다.
- 이제
copy
함수 호출 부분을 보면 copy(s1, s2);
와 같이 문자 배열과 문자열 포인터가 들어가는 상황은 올바른 상황이다.
- 하지만
copy(NULL, s2);
와 같이 NULL
이 들어가면 함수 안의 assert
는 거짓되므로 프로그램이 중단된다.
char s1[100];
char *s2 = "Hello, world!";
copy(s1, s2); // 정상 동작
copy(NULL, s2); // NULL이 들어갔으므로 프로그램 중단
- 사실
assert
없이 strcpy
함수에 바로 NULL
이 들어가도 에러가 발생하고 프로그램은 중단된다.
- 하지만
strcpy
함수에서 에러가 나는 상황은 여러 가지이므로 버그를 찾으려면 모든 상황을 조사해야 한다.
- 이때 미리
assert
로 일어나서는 안 되는 상황을 정의해놓으면 버그를 빠르게 찾을 수 있다.
References