![2021년 정기 2회 정보처리기능사 실기 문항 UB 오류](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPWY0Z%2Fbtq7bEJvjJr%2Ftp4GETbYs0kbgJqNJsPCq1%2Fimg.png)
어제(6.12.)부터 2021년 정기 2회 정보처리기능사 실기 시험이 시작됐습니다. YouTube나 각종 커뮤니티에서는 벌써 복원문제와 가답안이 공개되고 있어 저도 관심있게 보고 있었는데, Twitter나 여러 코딩 커뮤니티를 중심으로 한 문제에 UB (Undefined Behavior) 오류가 있다는 논란이 불거져 이에 대해 짚어보도록 하겠습니다.
우선 논란이 된 문제는 다음과 같습니다.
C언어로 작성된 다음 코드를 보고, 출력 결과를 적는 서답형 문제였습니다.
#include <stdio.h>
int main(void){
int i;
char str[4];
str[0] = 'K';
str[1] = 'O';
str[2] = 'R';
str[3] = 'E';
str[4] = 'A';
for(i=0; i<5; i++){
printf("%c", str[i]);
}
return 0;
}
코드를 보면 for문의 조건으로 사용되는 int(정수)형 변수 i와 char형 배열인 str가 선언되어 있습니다. 보시다시피 str은 크기가 4인 배열로 인덱스 번호(Index Number)로는 0부터 3까지, 즉 str[0], str[1], str[2], str[3] 으로 총 4칸을 저장할 수 있는 배열임을 알 수 있습니다.
밑으로 계속 읽어보면, 배열 str을 하나씩 정의하는 코드가 적혀있습니다. str[0]에는 'K', str[1]에는 'O', str[2]에는 'R', str[3]에는 'E', str[4]에는 'A'를 저장합니다.
이어서 for 반복문을 통해 i를 0부터 5 미만, 즉 4까지 1씩 증가시키며 str[i]를 출력하는 코드를 반복합니다.
얼핏 생각하기에는 출력 결과는 "KOREA"라고 예상하실 수도 있을겁니다.
하지만 배열 선언으로 다시 돌아가봅시다. 앞에서 배열 str의 크기는 4로, Index no는 0부터 3까지로 할당되어 있습니다. 하지만 str[4]에 'A'를 저장합니다. 즉, 할당되지 않은 공간에 'A'를 저장했다는 뜻이고, 이를 다시 출력하고 있다는 말입니다. 상식적으로 말이 되지 않습니다.
이런 식으로 할당된 범위를 벗어난 배열의 접근이 생겼을 때 Undefined Behavior (UB) 오류가 발생합니다.
할당된 저장 공간을 벗어난 배열 정의와 사용, 과연 컴파일러와 IDE는 어떻게 작동할까요?
[ 1 ] Dev-C++ (Release)
Windows 10 (x64) 환경에 설치된 Dev-C++의 Release 모드에서 컴파일했을 때는 다음과 같이 컴파일됩니다.
오류는 발생하지 않으며 KORE까지는 정상적으로 출력됩니다. 당연한 일입니다. str이라는 배열에 저장되어있는 문자니까요. 다만, str의 범위를 벗어난 str[4]의 경우 쓰레기 값이 출력됩니다. %c로 출력하는 코드였기 때문에, ASCII 값에 맞는 문자가 출력이 되었겠네요.
[ 2 ] Repl.it
온라인 IDE 사이트인 Repl.it에서 컴파일한 결과입니다.
Dev-C++과 마찬가지로 'KORE'까지는 정상적으로 출력됩니다. 하지만 앞선 컴파일 과정에서 Index의 범위를 초과했다는 경고와 함께 오류 메세지가 발생하고 있습니다. 정상적인 컴파일이 아니라는 뜻입니다.
[ 3 ] 구름IDE
Ubuntu 18.04 LTS를 사용하는 Goorm IDE에서 컴파일한 결과입니다.
아예 컴파일이 되지 않았습니다. 하단의 오류 메세지를 보면 'Stack Smashing Detected' 뜨며 컴파일 과정이 중단(Terminated) 됐습니다. Stack Smashing Detected는 메모리 공간을 벗어난, 이른바 스택 오버플로우(Stack Overflow)가 발생한 경우 메모리 보호를 위해 코드 실행을 차단했을 때 발생하는 오류입니다. 이 과정을 흔히 Stack Protection이라 부르고, 컴파일 옵션에서는 -fstack-protector를 통해 설정할 수 있습니다. 즉, 코드 자체에 문제가 있어 작동을 하지 않는 경우입니다.
[ 4 ] Visual Studio 2019 (Release)
Visual Studio 2019 버전의 Release 모드에서 컴파일한 결과입니다. (제공해주신 트친분께 감사의 말씀을 전합니다)
컴파일은 정상적으로 이뤄지고 출력 내용은 'KOREA'로 str[4]의 문자까지 출력이 되나, 메모리 할당의 문제로 인해 Runtime Error(런타임 에러)가 발생합니다. 즉 str[3] 다음의 메모리 공간인 str[4]까지는 어째 출력은 할 수 있지만 잘못된 코드로 인해 실행 중 오류가 발생한다는 말입니다.
[ 5 ] Visual Studio 2019 (Debug)
Visual Studio 2019 버전의 Debug 모드에서는 아예 컴파일 자체가 되지 않습니다. 할당되지 않은 공간에 문자를 저장하려 했기 때문에 컴파일 과정에서 오류를 출력하는 것입니다.
간략하게 5개의 IDE에서 각각 어떻게 작동하는지 확인해봤습니다. 'KOREA'까지 출력하는 IDE도 있는 반면에, 아예 작동하지 않는 IDE도 있어 문제에 대한 답을 정의하기가 어렵습니다. Memory Allocation이 잘못된 경우 실행이 아예 되지 않거나, 실행이 되더라도 시험에 출제될 수 있게 결과값이 동일하지는 않습니다.
왜 이런 문제가 국가공인자격 시험에 출제됐는지는 모르겠지만, 무효(전원 정답) 또는 복수 정답 처리가 되어야 하지 않을까 하는 생각이 듭니다. 복수 정답이라면 답은 Runtime Error, Compile Error, KOREA, KORE* 모두를 포함해야 마땅하겠지만, 출제진이 이를 어떻게 판단할지 알 수가 없네요.
Undefined Behavior 코드가 문제로 나온만큼 출제 기관의 모범 답안이 궁금하지만, 한국산업인력공단에서는 답안과 채점 기준을 공개하지 않아 아쉬울 따름입니다.
정보처리기능사는 국가에서 공인하는 국가 기술자격 시험입니다. 그런 공인된 시험에서 UB 오류를 발생시키는 코드를 가지고 문제를 출제하는 일이 이번 뿐만은 아니었습니다.
이번 시험 역시 UB 오류가 발생하는 코드로 시험이 출제가 됐습니다. 판단은 출제진과 출제 기관의 몫이겠지만, 이로 인한 피해는 시험을 응시한 분들께 돌아간다는 점을 명심해줬으면 하는 바람입니다.
블로그에 작성 전 SNS에서 먼저 이 내용을 다뤘습니다. 궁금하신 분은 제 Twitter를 확인해주세요 :)
'[ IT ] > Talk' 카테고리의 다른 글
Twitter Media Studio 접속 및 사용 방법 (2024. 7. 9.) (299) | 2024.07.09 |
---|---|
육군 정보보호병 선발 면접 후기 (`22. 1. 13. / 재업로드) (8) | 2022.11.29 |
Windows 10 PC에서 한국어 입력 오류 시 해결 방법 (18) | 2021.06.14 |
개발 적당히, 정치 적당히, 일상 적당히, 그냥 뭐든지 적당히만 하는 소프트웨어전공 대학생, 쏘가리입니다. Profile Image by REN (Twt@Ren_S2_)
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!