실행을 재개 할 때마다 예외가 다시 발생하기 때문에 무한 루프가 발생합니다. 트랩을 유발 한 명령 (이 경우 0으로 나누기)에서 실행이 재개되기 때문에 필터에 s = 1
값을 설정하는 것은 중요하지 않습니다. 다음과 같이 코드를 재구성하는 경우는 예외가 지속적으로 발생되고 있음을 볼 수 있습니다 :
이
int ExceptionFilter(int& s) {
cout << "exception filter with s = " << s << endl;
s++;
return -1; // EXCEPTION_CONTINUE_EXECUTION
}
void SEHtest() {
int s = 0;
__try {
cout << "before exception" << endl;
int j = 1/s;
cout << "after exception" << endl;
} __except(ExceptionFilter(s)) {
cout << "exception handler" << endl;
}
cout << "after try-catch" << endl;
return;
}
int main() {
SEHtest();
return 0;
}
결과 읽어야합니다
before exception
exception filter with s = 0
exception filter with s = 1
exception filter with s = 2
...
예외는 실행이 재개되기 때문에 슬로우 계속 s의 값을로드하는 명령어가 아닌 0으로 나누는 명령어. 단계는 다음과 같습니다.
1 set a register to 0
2 store that register in s (might be optimized out)
3 enter try block
4 output "before exception"
5 load a register from s
6 divide 1 by register (trigger exception)
7 jump to exception filter
8 in filter increment/change s
9 filter returns -1
10 execution continues on line 6 above
6 divide 1 by register (trigger exception)
7 jump to exception filter
8 in filter increment/change s
9 filter returns -1
10 execution continues on line 6 above
...
나는 그 예외에서 재개 할 수 없을 것이라고 생각합니다.
컴파일러에서 생성 한 어셈블리 코드를 살펴보십시오. 일반적인 C/C++ 제어 흐름에서 다른 값을 가질 수있는 방법이 없기 때문에 (1/s)의 s가 상수 0으로 처리 될 가능성이 큽니다. – arx
어떤 컴파일러를 사용하고 있습니까? C++ 빌더를 사용하고 나에게 잘 돌아 간다면,'code1','code2','code4'를 예상대로 볼 수 있습니다. –
Visual Studio 2008의 @RemyLebeau VC 컴파일러 – user1761982