[C] assert 함수로 디버깅과 테스트를 최적화 하자

C 에서 assert 함수는 특정 조건이 참인지를 검사하는데 사용됩니다.이 기능은 디버깅시에 아주 유용하며 프로그램 테스트시에 최고의 성능을 발휘 합니다.

설명

포함할 헤더

#include <assert.h>

함수 원형

void assert( int condition );

이 함수는 디버그 모드에서만 동작되며 릴리즈 모드일경우는 동작하지 않습니다.
어설션은 변수 또는 메모리 영역의 상태를 테스트하는 데 사용됩니다. 예상과 일치하지 않으면 프로그램이 중단되고 오류 메시지가 표시됩니다. 이 메커니즘은 객체 지향 언어(C++)에서와 같이 예외 발생에 가깝다고 생각할 수 있습니다. 완전히 틀린 말은 아니지만, 어설션을 가로챌 수 없다는 차이점이 있습니다.

매개 변수

condition: 어설션을 트리거하거나 트리거하지 않기 위해 평가할 조건입니다. 값이 true인 경우(모든 값 0이 아닌 정수)이면 어설션이 트리거되지 않습니다. 값이 false(0과 같음)이면 어설션이 트리거됩니다 그리고 프로그램은 어설션에 대한 오류 메시지와 함께 종료됩니다.

반환 값

이 함수에서 반환 값이 생성되지 않습니다.

C 언어에서 assert 함수의 이점

c 언어에서 assert 함수는 디버깅과 테스트에 매우 유용합니다.

  1. 조건 확인: assert는 특정 조건이 참인지 검사합니다. 만약 조건이 거짓이면 프로그램이 중단됩니다.
  2. 디버깅: assert는 코드에서 버그를 찾고 수정하는 데 도움이 됩니다. 조건이 거짓이면 프로그램이 중단되어 문제가 발생한 위치를 파악할 수 있습니다.
  3. 프로그램 불변성 검증: assert는 프로그램의 가정이나 불변성을 검증하여 예상치 못한 상황을 방지하는 데 사용됩니다.
  4. 컴파일러 최적화: assert는 코드 실행 시 비활성화될 수 있어서, 릴리즈 버전에서는 무시되고 코드가 최적화됩니다.

이러한 기능들은 프로그램의 안정성과 신뢰성을 높이는 데 도움을 줍니다.

예제

#include <stdio.h>          
#include <assert.h>

// Use (void) to silence unused warnings.
#define assertm(exp, msg) assert(((void)msg, exp))

int main()
{
    assert(2 + 2 == 4);
    printf("Checkpoint #1\n");

    assert((void("void helps to avoid 'unused value' warning"), 2 * 2 == 4));
    printf("Checkpoint #2\n");

    assert((010 + 010 == 16) && "Yet another way to add an assert message");
    printf("Checkpoint #3\n");

    assertm((2 + 2) % 3 == 1, "Success");
    printf("Checkpoint #4\n");

    assertm(2 + 2 == 5, "Failed"); // assertion fails
    printf("Execution continues past the last assert\n"); // No output
}

위 함수를 debug mode 로 실행해 보겠습니다.

컴파일러가 GCC 일경우는 다음처럼 그냥 빌드 하시면 됩니다.

$> gcc file.c

Visual Studio 일경우 디버그 모드는 다음처럼 도구박스에서 선택 하시면 됩니다.

[C] assert 함수로 디버깅과 테스트를 최적화 하자


출력은 다음과 같습니다.

Checkpoint #1
Checkpoint #2
Checkpoint #3
Checkpoint #4
a.out: a.c:21: main: Assertion `((void)"Failed", 2 + 2 == 5)' failed.
Aborted (core dumped)

자 그럼 릴리즈 모드에서 빌드 하면 어떻게 실행되는지 보겠습니다.

GCC일경우 NDEBUG 가 설정되면 assert 가 실행되지 않습니다.

$> gcc -DNDEBUG file.c

Visual Studio 일경우는 다음 처럼 선택만 해주면 됩니다.

[C] assert 함수로 디버깅과 테스트를 최적화 하자


결과 값을 한번 보겠습니다.

[C] assert 함수로 디버깅과 테스트를 최적화 하자

어떤가요? 릴리즈 모드일경우는 assert가 적용되지 않습니다.

결론

어설션은 프로그램의 안정성을 높이고 예상치 못한 상황에서의 동작을 예방하는 데 도움이 됩니다. 적절한 어설션 사용은 코드의 신뢰성을 높이고 프로그램 오류를 미리 방지할 수 있습니다.

위 글은 주어진 텍스트를 재구성하여 매크로 어설션(assertion)에 대한 설명을 담은 것입니다. 어설션의 역할, 사용 방법, 그리고 우회 방법 등을 다루며, C++에서의 활용과 프로그램 안정성에 미치는 영향을 강조하고 있습니다.

Leave a Comment