2012-11-28 5 views
-1

XSD를 다른 유형의 XSD로 구문 분석하기 위해 재귀 적으로 인스턴스화하는 클래스를 프로그래밍했습니다. 인터넷에서 다운로드 한 후 각 요소를 살펴본 후 요소 중 하나에 이있는 complexType이 있으면 그 자체의 인스턴스 중 하나를 만들어 동일한 작업을 수행합니다.정적 메서드를 사용하여 Stackoverflow 예외 방지

그러나 XSD가 크고 외부 링크가 많은 경우 오늘 Stackoverflow 예외로 인해 클래스가 다운되었습니다.

일부 인스턴스 메서드를 정적 멤버로 다른 클래스 (Helper.cs)에 넣기로하고 이제는 파서 클래스 내에서 인스턴스 메서드를 호출하기로 결정했습니다.

그러나 이것이 좋은 해결책이고 Stackoverflow 예외를 해결할 수 있는지 궁금합니다. 어떻게 인스턴스 메서드를 스택 프레임에 넣을 지 알지만 정적 메서드는 같은 방식으로 처리됩니까? Stackoverflow 예외가 발생합니까?

답변

8

인스턴스 메서드와 정적 메서드의 유일한 차이점은 인스턴스 메서드가 숨겨진 추가 this 매개 변수를 사용한다는 것입니다. 실제로 인스턴스 메서드는 virtual 일 수도 있지만 여기서는 차이가 없습니다.

둘 다 똑같이 스택 오버플로에 취약합니다.

큰 입력에 대해 스택 오버플로를 방지하려면 재귀를 사용하지 마십시오.

+0

그래서 문제를 해결하려면 어떻게해야합니까? –

+0

지금은 나빠요! – Tarik

+1

+1. 신뢰할 수없는 입력을 구문 분석하는 재귀 코드는 보안 문제입니다. 할 일이별로 없지만 재귀를 피하기 위해 리팩터링하거나 지나치게 중첩 된 구조에 실패하는 일종의 "재귀 방지"카운터가 있습니다. –

1

정적 대 인스턴스는 질문에 아무런 영향을 미치지 않습니다. 스택 깊이는 호출에 따라 증가하거나 감소하며 스택이나 힙에있는 함수가 포함 된 실제 메모리에는 영향을 미치지 않습니다.

무한 종료 조건이없는 루프, 무한대로 계산되는 루프 또는 너무 단순한 데이터 소스를 찾으십시오. 귀하의 프로젝트가 웹 서버에서 실행되고 있습니까? IIS에는 데스크톱 응용 프로그램보다 더 제한적인 스택 크기 (w3wp.exe로 컴파일 됨)에 대한 기본 제한이 있습니다.

관련 문제