Notice
Recent Posts
05-19 00:13
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Today
Total
관리 메뉴

프로그래밍 잡화점

main의 반환형에 관한 고찰 (In C) 본문

C, C++ 분석 보고서

main의 반환형에 관한 고찰 (In C)

Luana7 2022. 5. 4. 17:58
들어가기 앞서
- 해당 글은 GCC와 C파일을 기준으로 작성되었습니다. 컴파일러마다 다를 수도 있습니다.

 
기본적으로 어셈을 배울 때 종료 시에 eax 또는 rax를 0으로 초기화한 후 ret을 해주는 과정을 볼 수 있다

xor eax, eax ; = 0
mov eax, 0   ; 위와 같은 코드이다. 그러나 위를 많이 쓰는 경향이 있다.
ret          ; 종료 지시문 (return)

C언어에서 main에서 return 0;을 사용하는 것과 같다고 보면 된다.

GCC의 경우 return 0을 안넣어도 알아서 추가해주는 똑똑한 컴파일러다.
그런데 여기서 의문이 생긴다.

"만약, main의 반환형이 int가 아니라 다른 타입이면 어떤 일이 발생할까?"

처음에는 int와 void의 비교를 위해서 두 코드를 역어셈 해보았다.

int main
void main

두 코드의 차이점을 보자면 void에서는 eax(어셈블리에서 함수의 반환 값으로 주로 사용되는 레지스터)를 0으로 만드는 부분이 nop으로 대체되어있다
(nop은 간단히 말해 아무것도 실행하지 않는다는 구문이다. 이유가 궁금하다면 검색해보길 바란다)

이로써 eax의 초기화가 이루어지지 않은체 프로그램을 종료하는데
대부분 알다 싶이 main 함수의 반환 값은 OS에게 전달된다.

즉, 반환 값이 무엇인지는 아무도 알 수 없다는 것이다
 

이후 추가적으로 알아보기 위하여 void 타입 외에도 다른 타입에 대해서 실험을 진행해보았다.
 

long long main() { }
short main() { }
char main() { }
...
struct tmp { int x; };
struct tmp main() { }

놀랍게도, 모두 void와 같은 코드를 생성해냈다. 그러나, return 값이 있는 경우 해당 값을 eax에 집어넣는 코드가 생겼다.
 
결론적으로 알 수 있는 것은,

GCC의 경우 main의 반환형이 0인 경우에 대해 서면 자동적으로 return 0 코드를 생성해준다.

로 정리할 수 있을 것 같다.


+ 수정

C 표준 상으로 다음과 같은 내용이 정의되어 있다.
- C99 이전)
return시 값을 전달하지 않거나, 그러한 경우에 } 를 만날 경우, 해당 return문은 무시되며 운영체제에게 반환되는 종료 상태(int)는 정해지지 않는다.
-C99 부터)
반환형이 int와 호환 가능한 자료형이 아닐 경우, 반환 상태는 정해지지 않은 값이 된다.
그 외에 int와 호환 가능 한 경우에 return이 존재하지 않아도, }를 만나면 return 0;을 한 것과 같은 동작을 한다.

참고 : main function (Explanation - 3)

'C, C++ 분석 보고서' 카테고리의 다른 글

struct 반환에 대한 고찰  (2) 2023.04.06
함수의 반환에 대한 고찰  (0) 2022.12.27
if에 관한 고찰 (In C)  (0) 2022.03.13
bool과 int의 관계 (In C)  (0) 2022.03.12
for에 관한 작은 고찰 (In C)  (0) 2022.03.11
Comments