미정의 동작(Undefined Behavior, UB) — 이는 C 언어 표준에 의해 프로그램의 결과가 정의되지 않은 동작입니다. 컴파일러나 시스템은 눈에 띄지 않는 오류부터 전체 시스템 충돌이나 데이터 손상까지 무엇이든 수행할 수 있습니다.
UB의 일반적인 원인:
UB를 최소화하는 방법:
int arr[5]; arr[10] = 0; // UB — 배열 경계 초과 int* p = NULL; *p = 42; // UB — NULL 포인터 간접 참조
질문: 정수 0으로 나누면 프로그램이 어떻게 될까요?
답변: C 표준 (ISO C99 6.5.5)에 따르면 0으로 나누기는 미정의 동작입니다. 충돌이 발생하거나 쓰레기 값이 나타나거나 심지어 "논리적으로 올바른" 결과가 나올 수 있지만, 표준은 어떤 결과도 보장하지 않습니다.
int a = 10, b = 0; printf("%d", a / b); // 미정의 동작
이야기
임베디드 시스템 프로젝트 중 한 프로그래머가 배열을 순회하는 루프를 작성하며 실수로 경계를 하나 초과했습니다. 애플리케이션은 정상적으로 동작했지만 한 달 후 메모리의 다른 데이터가 손상되기 시작했습니다(일시적 오류, 재현하기 어려움). 문제는 철저한 리뷰와 정적 분석기를 통해서만 발견되었습니다.
이야기
개발자는 NULL 포인터 간접 참조가 항상 충돌을 일으킨다고 믿고 있었기 때문에 NULL 검사를 추가하지 않았습니다. 그러나 드문 플랫폼에서는 잘못된(하지만 치명적이지 않은) 메모리 수정을 일으켜 다른 구조체를 망치고 재현하기 어려운 버그를 초래했습니다.
이야기
의사 난수 생성기에서 나누기를 사용했으며 특정 입력 인자 값에서 0으로 나누기가 발생했습니다. 대부분의 플랫폼에서는 프로그램이 "충돌"했지만, 특정 플랫폼에서는 잘못된 수치가 생성되어 여러 환경 간 버그 재현이 불가능해졌습니다.