"If a return statement without an expression is executed, and the value of the function call is used by the caller, the behavior is undefined. Reaching the } that terminates a function is equivalent to a return statement without an expression."
정의된거다..라는것 하나네요.
요새 ruby하고있는데
작성하신 코드보고, "응? 당연한거아닌가?" 라는 생각을했네요...ㅋㅋ
X.c: In function ‘sum’:
X.c:4:13: warning: unused variable ‘buf’ [-Wunused-variable]
X.c: At top level:
X.c:6:1: warning: return type defaults to ‘int’ [-Wreturn-type]
X.c: In function ‘main’:
X.c:9:1: warning: control reaches end of non-void function [-Wreturn-type]
X.c: In function ‘sum’:
X.c:5:1: warning: control reaches end of non-void function [-Wreturn-type]
코드상에 명시적으로 return 을 적어주지
코드상에 명시적으로 return 을 적어주지 않았어도
sum() 함수를 작성할때 리턴타입을 int 로 적었으니
마지막 계산결과인 int buf 값이 자동으로 리턴되었을것 같네요.
몇가지 코드를 수정해 보면서 실험한 결과는 아래와
몇가지 코드를 수정해 보면서 실험한 결과는 아래와 같습니다.
void sum(int a, int b)로 바꾸면 컴파일 에러납니다.
sum(int a, int b)로 바꾸면 컴파일 되고, 리턴값도 8로 들어오는군요.
sum함수가 3+5를 계산하기위해서 스택에 8을
sum함수가 3+5를 계산하기위해서 스택에 8을 저장했을 수 있구요
printf가 호출되면서 출력할 값을 스택에서 꺼냈는데 보통 스택에 있는 쓰레기값이 나올텐데
어쩌다보니 sum함수가 8을 저장한 스택 위치에서 값이 꺼내진것 같습니다.
디스어셈블해보면 정확하게 알 수 있지만 컴파일러나 옵션에 따라서 되기도하고 안되기도 할것 같습니다.
성능 옵션을 올려보시면 아마 값이 달라질거에요.
...
컴파일러마다 다르지만 보통 return문을 명시하지 않으면 반환값을 넣어둘 예정으로 있던 레지스터의 값을 반환합니다.
그 과정에서 sum 함수의 연산 도중값이 들어있는 경우가 많기 때문에 buf의 내용이 리턴된 것입니다. (항상 그런 동작이 보장되지는 않음.)
검색해봤습니다.
http://stackoverflow.com/questions/4644860/function-returns-value-without-return-statement
http://stackoverflow.com/questions/6638963/checking-return-value-of-a-function-without-return-statement
잘 모르지만,
검색을 통해 학습한건, EAX라는 레지스터때문이라는것 하나.
"If a return statement without an expression is executed, and the value of the function call is used by the caller, the behavior is undefined. Reaching the } that terminates a function is equivalent to a return statement without an expression."
정의된거다..라는것 하나네요.
요새 ruby하고있는데
작성하신 코드보고, "응? 당연한거아닌가?" 라는 생각을했네요...ㅋㅋ
흘러가고있는 지금 이 시간에 충실하자.
여러번 얘기하지만 undefined behavior에
여러번 얘기하지만 undefined behavior에 대해서는 고민할 필요가 없습니다.
해당 undefined behavior에 대해 나올 수 있는 얘기들은
그냥 저마다 짐작을 얘기하는 것뿐이지 정답이 있는 것도 아닙니다.
그게 영어로 적혀있던 한글로 적혀있던 정답이 아닙니다.
더군다나 실제로 사용하는건 금물.
댓글 감사합니다.
댓글 감사합니다. 많은것을 배우고 가네요.
글에는 깜빡하고 못썼지만 gcc에 std 옵션으로 어떤것을 넣어도 경고문이 뜨지 않아 질문하게 되었었습니다.
안녕하세요,
고맙습니다.
-Wall 옵션을 주고 컴파일한
-Wall 옵션을 주고 컴파일한 결과입니다.
X.c: In function ‘sum’:
X.c:4:13: warning: unused variable ‘buf’ [-Wunused-variable]
X.c: At top level:
X.c:6:1: warning: return type defaults to ‘int’ [-Wreturn-type]
X.c: In function ‘main’:
X.c:9:1: warning: control reaches end of non-void function [-Wreturn-type]
X.c: In function ‘sum’:
X.c:5:1: warning: control reaches end of non-void function [-Wreturn-type]
댓글 달기