2GB의 RAM이있는 Visual C++를 사용하는 Windows XP에서 스택 오버 플로우를 생성하는 데 동시에 스택에 있어야하는 함수의 수는 얼마입니까? (즉 재귀 함수에서)스택 오버 플로우를 생성하는 함수는 몇 개입니까?
다른 유사한 상황에 대해 이것을 계산할 수있는 간단한 방법이 있습니까?
2GB의 RAM이있는 Visual C++를 사용하는 Windows XP에서 스택 오버 플로우를 생성하는 데 동시에 스택에 있어야하는 함수의 수는 얼마입니까? (즉 재귀 함수에서)스택 오버 플로우를 생성하는 함수는 몇 개입니까?
다른 유사한 상황에 대해 이것을 계산할 수있는 간단한 방법이 있습니까?
컴파일러에서 알 수있는 방법이 없습니다. 스택 오버플로는 스택 오버플로로 인해 발생합니다. 스택의 크기는 함수가 취하는 인수, 함수가 사용하는 지역 변수 및 컴파일러 최적화에 따라 증가합니다. 스택에서 직접 공간을 할당한다고 믿는 일부 C99 함수도 있습니다.
스택 크기 제한은 컴파일러 스위치로 결정되며 컴퓨터에있는 RAM 크기는 아닙니다. 따라서 오버플로하는 데 걸리는 호출의 수는 메모리보다 컴파일러 설정과 관련이 있습니다.
선생님이 미리 결정할 수있는 것이 아닙니다. 적어도, 사소한 것은 아닙니다.
실제로 PE 옵션 헤더 (오프셋 72)의 SizeOfStackCommit 필드를보고 런타임에서 이미지의 스택 제한을 결정할 수 있습니다. 한스 (Hans)가 말했듯이 보통 0x10000 (1MB)입니다. –
무한 재귀를 시도 할 수 있습니다. 스택 오버플로의 일반적인 원인 중 하나입니다.
int f() { g(); } int g() { f(); }
이것은 질문에 대답하지 않습니다. - 게다가, 나는 그것이 5 초 미만의 스택 오버 플로우를 생성 할 것으로 예상 했었을 것이지만 대신 시간 초과되었다 : http://ideone.com/QoWtS;) – visitor
스택은 기본적으로 메가 바이트입니다. 가능한 가장 작은 스택 프레임은 최적화 된 빌드에서 4 바이트입니다. 실용적인 것들은 훨씬 큽니다. RAM은 아무 관련이 없습니다. –
하나의 함수 호출로 스택을 오버플로 할 수 있습니다. – mah