관리 메뉴

History

[C언어] assert 함수 본문

C,C++/개념 실습 프로그래밍

[C언어] assert 함수

luckybee 2023. 11. 14. 16:04
728x90
반응형

버그의 종류는 크게 2가지로 나뉜다. 

 

1. 문법상 코드를 잘못 작성해 발생하는 문법오류.

2. 문법상 문제는 없지만 예상치 못한 결과가 발생하는 논리적 오류.

문법 오류는 IDE의 인텔리센스가 경고를 띄워주기 때문에 대처가 가능하지만, 논리적 오류는 코드상 문제가 아니라 들어온 데이터, 수식 상 문제 등으로 발생하는 것이기 때문에 어느 위치에서 오류가 발생했는지 알기 쉽지 않다.

#include<stdio.h>
#pragma warning(disable:4996)


int Func(int a_value)
{
	int temp=5;
	temp /= a_value;
	return temp;
}

int main()
{
	int ans=Func(0);
}



간단히 위와 같은 코드로 예시를 들겠다.

빌드 성공


위 코드에서 인자값으로 0을 줬고 인자값으로 해당 함수에 있는 값을 나누면 빌드상 아무런 문제도 없다. 왜냐하면 문법적으로는 틀린 게 없기 때문에 IDE 인텔리센스에서 잡아주질 못하는 것이다.

 

그러나 위 코드를 실행시켜보면 무조건 프로그램이 죽는다. 왜냐하면 컴퓨터는 0으로 나누는 것은 불가능이라고 판단하기 때문에 프로그램이 그대로 죽는다. 이때 개발자는 어디서 프로그램이 죽었는지 찾기 난감하다. 이때 assert를 사용해 본다.

 assert를 쓰기 위해선 헤더를 먼저 달아야 하고, #include <assert.h> 헤더에 존재한다.

 

#include<stdio.h>
#include<assert.h>
#pragma warning(disable:4996)


int Func(int a_value)
{
	char arr[20];
	assert(a_value);
	int temp=5;
	temp /= a_value;
	return temp;
}

int main()
{
	int ans=Func(0);
}

 

 

 이렇게 작성하면 a_value 값이 0일 때 assert에서 경고 메시지를 띄워주고 사용자는 오류를 인지할 수 있다. 그리고 프로그램을 중단시키면서 해당 위치를 잡는다.

 

p.s) assert는 인자가 0이면 오류를 잡아준다.

 

 

또한 이렇게 프로그램이 죽는 상황이 생길 때 사용자가 어떠한 이유 때문에 이런 메시지가 발생하는지 알려주는 것도 분명 개발하는데 도움을 줄 것이다. assert는 메시지를 출력할 수 있는 기능도 가지고 있다.

 

assert(a_value&& "0으로 나누면 에러가 발생합니다.");

 

 

처음 사용하는 사람들은 assert가 뭐가 좋은지 모른다. 그냥 if문으로 전부 처리가 가능할 테니 말이다.

 

그러나 릴리즈 모드로 제품이 나갈 때 assert만큼 좋은 게 없다. 컴파일 인수에 NDEBUG 옵션이 들어가면 assert는 작동을 하지 않기 때문이다. 이러한 특성으로 Release로 프로그램을 컴파일할 때 컴파일 옵션에 NDEBUG를 작성해 주면 된다.

 

 

NDEBUG 옵션을 설정하는 방법을 알려주겠다. 우선  프로젝트 속성을 연다.

 

아래 이미지처럼 속성 창의 상단 왼쪽, 구성 옵션이 Release로 설정한다.

 

그 후 왼쪽 메뉴에서 [구성속성 - C/C++ - 명령줄]을 클릭-> 추가 옵션(D)에 " /D NDEBUG "를 추가

 

이렇게 추가한 뒤 구성을 Release로 하여 컴파일을 진행하면 Release모드에서 assert 기능이 수행되지 않는다.

728x90
반응형
Comments