지역변수는 스택에 저장됩니다
따라서 지역변수 근처의 잘못된 주소를 건드리면 다른 지역변수의 값이 바뀌거나 스택이 망가질 수 있는데
디버그 모드에서는 이런걸 잡아주기 위해서 스택에 여유분을 두고 스택이 망가지면(corrupted라고 함) 알려줌
그런데 함수의 스택을 정리하는 시점은 함수가 끝날 때이기 때문에 이 스택 망가짐 알림 역시 함수가 끝나고 진행되는 것입니다
릴리스 모드에서는 딱히 이런 처리를 해주지 않으므로 스택이 그냥 망가집니다. 그 결과 함수 종료시 프로그램이 깨질(crash) 가능성이 있습니다
참고로 지역변수 근처의 잘못된 주소를 건드렸을 때 생길 수 있는 일은 3가지 정도로 정리할 수 있음
(1) 현재 함수 또는 현재 함수를 호출한 함수의 엉뚱한 지역변수가 건드려짐
(2) 지역변수들 사이의 여유 공간이 건드려짐 (겉으로 보기에는 문제가 발생하지 않음)
(3) 스택이 파괴됨 → 함수 종료시 오류 발생 (돌아가야 하는 주소가 스택에 저장되는데 스택이 파괴되었으므로 보통 프로그램이 깨짐)
저도 티나랑 이얘기 지금하고있었는데 지역변수 스택영역에 잘못건들였을때 생기는거 얘기. 근데 for문에서 마지막에가서 문제가생기는이유는머임? 컴파일러가 최적화? 정리하면서 결과적으로 나중에 다치고나서 정리되면서 그게 처리되면서 에러가나서 그렇게보이는걸까 싶었는데 확실히는몰라서
본문에 언급했다시피 스택 점검을 스택이 정리되는 시점 (함수 종료 시점)에 하기 때문임.
디버그 모드가 아니면 스택 점검은 해주지 않고, 그 경우 스택이 망가진 상태라면 그대로 프로그램이 깨짐.
자바 사무원이라면 절대로 알 수 없는 내용들이네요 . 개추드립니다 .
최적화와는 관련이 없음.
감사합니다.
가장 무서운 경우는 2번이군요? 개복치 프로그램 탄생!
깔끔하게정리댔내영 ㄳ
스택영역말고 다른영역들은 어때요? 의도하지않은 영역의접근에대한 처리가?
http://ideone.com/e4QvMu
이렇게 하면 바로 에러난다 자바는 이렇게 동작하는게 기본인거고