2012-02-28 2 views
0

2GB의 RAM이있는 Visual C++를 사용하는 Windows XP에서 스택 오버 플로우를 생성하는 데 동시에 스택에 있어야하는 함수의 수는 얼마입니까? (즉 재귀 함수에서)스택 오버 플로우를 생성하는 함수는 몇 개입니까?

다른 유사한 상황에 대해 이것을 계산할 수있는 간단한 방법이 있습니까?

+0

스택은 기본적으로 메가 바이트입니다. 가능한 가장 작은 스택 프레임은 최적화 된 빌드에서 4 바이트입니다. 실용적인 것들은 훨씬 큽니다. RAM은 아무 관련이 없습니다. –

+1

하나의 함수 호출로 스택을 오버플로 할 수 있습니다. – mah

답변

3

컴파일러에서 알 수있는 방법이 없습니다. 스택 오버플로는 스택 오버플로로 인해 발생합니다. 스택의 크기는 함수가 취하는 인수, 함수가 사용하는 지역 변수 및 컴파일러 최적화에 따라 증가합니다. 스택에서 직접 공간을 할당한다고 믿는 일부 C99 함수도 있습니다.

스택 크기 제한은 컴파일러 스위치로 결정되며 컴퓨터에있는 RAM 크기는 아닙니다. 따라서 오버플로하는 데 걸리는 호출의 수는 메모리보다 컴파일러 설정과 관련이 있습니다.

선생님이 미리 결정할 수있는 것이 아닙니다. 적어도, 사소한 것은 아닙니다.

+1

실제로 PE 옵션 헤더 (오프셋 72)의 SizeOfStackCommit 필드를보고 런타임에서 이미지의 스택 제한을 결정할 수 있습니다. 한스 (Hans)가 말했듯이 보통 0x10000 (1MB)입니다. –

0

무한 재귀를 시도 할 수 있습니다. 스택 오버플로의 일반적인 원인 중 하나입니다.

int f() { g(); } int g() { f(); }

+0

이것은 질문에 대답하지 않습니다. - 게다가, 나는 그것이 5 초 미만의 스택 오버 플로우를 생성 할 것으로 예상 했었을 것이지만 대신 시간 초과되었다 : http://ideone.com/QoWtS;) – visitor

관련 문제