아무리 웹땔감 겔이지만 혹시나 해서 질문 올립니당
질문글인만큼 존댓말로 글 작성 하겠슴다
int& function() {
int a = 1;
return a;
}
이게 왜 작동하죠???
경고만 띄워주고
출력하면 1을 출력해줍니다
제 생각으로는 작동을 하려면
int& function(int &a) {
return a;
}
int main() {
int a = 1;
std::cout << function(a) << std::endl;
}
이렇게 작성해야 경고없이 작동을 하는데
위에 함수가 왜 작동하는지 궁금합니다!!!
아무리 멍청한 짓을 하더라도 문법상 들어맞으면 컴파일은 됨.. 제대로 작동하는지 어쩐지를 알 수 없는거고
아 왜 작동하는건지는 컴파일러 개발자만 안다는거네 그럼
스택 영역이니깐 다른 값이 저기를 덮어쓰기 전까진 제대로 굴러갈꺼라고 추측해 볼 수는 있음
사람들이 UB에 대해서 오해하는게 틀리면 틀렸다고 나와야 되는거 아니냐고 자꾸 생각하는데 "그건 틀렸다"라고 정해져 있다면 잘 정의된거지 undefined가 아님
이러니까 사람들이 러스트를 좋아하는게 아닐까
동작한다고 다 올바른 것은 아님. 함수를 호출하면 bp와 sp를 이용해서 스택을 확보하고, 스택에 지역변수를 쓰게 됨. 함수에서 나가게 되면, 다시 이전의 bp와 sp를 불러와서 다시 스택을 조절함. 이 때, 기존의 스택을 건드리는게 아니고 오로지 bp와 sp를 건드림. 따라서 함수를 호출하면서 얻은 스택 영역에 써있던 지역변수는 마치 유효한것처럼 동작하기도 함. 그런데, 언제든지 잘못된 동작을 할 수 있는 것이라 컴파일러가 경고를 하는 것임