Skip to content

88. assert


1. 키워드

  • assert


2. assert 사용하기

  • assert 매크로는 assert.h 헤더 파일에 정의되어 있으며 정해진 조건에 맞지 않을 때 프로그램을 중단한다.
  • 즉, assert에 지정한 조건식이 거짓일 때 프로그램을 중단하며 참일 때는 프로그램이 계속 실행된다.


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);과 같이 포인터 destNULL이 아니면 프로그램을 계속 실행하도록 만들어져 있다.


void copy(char *dest, char *src)
{
    assert(dest != NULL); // dest이 NULL이면 프로그램 중단
    assert(src != NULL);  // src가 NULL이면 프로그램 중단

    strcpy(dest, src); // 문자열 복사
}


  • assert의 조건식을 지정할 때는 항상 올바른 상황을 정한다고 생각하면 쉽다.
  • 여기서는 strcpyNULL이 들어가면 안 되므로 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