C언어 함수표현식 질문입니다.

I LY@Google의 이미지

void __noreturn do_exit(long code)

리눅스 디버깅을 하다 이렇게 생긴 함수 표현을 봤는데
__noreturn 이 표현은 아무리 봐도 잘못 표현된 듯 한데
버젓이 코드안에 있는게 이해가 안됩니다.

이게 가능한가요??

익명 사용자의 이미지

https://elixir.bootlin.com/linux/v5.15.2/source/include/linux/compiler_attributes.h#L249

프로그래머의 의도를 더 정확하게 반영하거나 최적화를 더 잘 하기 위한 컴파일러 확장 문법 되겠습니다.

https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes

나빌레라의 이미지

말 그대로 리턴하지 않겠다는 것을 컴파일러에게 알려주는 코드입니다.
C 언어 컴파일러가 코드를 컴파일 하면 함수는 반드시 리턴해야 합니다.
그리고 함수를 시작할 때 함수에서 사용하는 레지스터를 백업하고,
함수 끝날 때 리턴 직전에 레지스터를 리스토어하는 코드가 들어갑니다.
코드에 return 표현식을 쓰지 않아도(void 함수) 컴파일러는 해당 아키텍처에 맞는 리턴 어셈블리 명령어를 함수 끝에 추가해서 리턴 어드래스 (ARM의 경우 ld 레지스터)에 기록된 메모리 위치로 되돌아갑니다.
그런데 __noreturn 을 함수 선언에 사용하면 컴파일러는 레지스터를 백업/리스토어하는 코드와 이 리턴하는 어셈블리 명령어를 만들지 않습니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라