biegnę do problemu z floating point wyjątki włączone w Visual Studio 2005. Jeśli mam kod jak poniżej:zmiennoprzecinkowej postępowania z wyjątków zmiennoprzecinkowych stos włączony
double d = 0.0;
double d2 = 3.0;
double d3 = d2/d;
i gdybym zarejestrować procedura obsługi SEH, a następnie mogę łatwo przekształcić div-by-zero w wyjątek C++ i go przechwycić. Jak na razie dobrze.
Jednak, gdy to zrobię, pierwszy operand (0.0 w powyższym przykładzie) pozostanie na stosie rejestru FPU. Jeśli zrobię to osiem razy, wtedy zacznę od tego momentu otrzymywać wyjątek sprawdzania stosu zmiennoprzecinkowego z KAŻDYM operatorem zmiennoprzecinkowym.
Mogę sobie z tym poradzić za pomocą bloku __asm, aby wykonać FSTP, odrywając w ten sposób zbłąkaną wartość ze stosu i wszystko jest w porządku.
Jednak to mnie martwi, ponieważ nie widziałem tego omawianego w dowolnym miejscu. Jak mogę być pewny liczby wartości, które powinienem wyskoczyć? Czy bezpiecznie jest po prostu wyskoczyć ze wszystkiego, co jest na stosie w momencie wyjątku? Czy są jakieś zalecane najlepsze praktyki w tej dziedzinie?
Dzięki!
Czy dzieje się to również z SEH? jeśli nie zarejestrujesz obsługi SEH, czy zachowujesz się tak samo? –
Dzieje się tak w wyniku wywołania funkcji _controlfp(), która demaskuje wyjątki, które mnie interesują (np. Div-by-zero). Nie sądzę, aby miało to znaczenie, jeśli mam zarejestrowany program obsługi SEH-a, ale jeśli nie, po prostu ulegam awarii z nieobsługiwanym wyjątkiem. –