Visual C ++ / Seltsames Verhalten nach dem Aktivieren von Gleitkommaausnahmen (Compilerfehler?)

8

Ich habe Schwierigkeiten, eine zuverlässige Methode zu finden, um unter Visual Studio (2005 oder 2008) Gleitkommaausnahmen einzufangen. In Visual Studio werden Gleitkommaausnahmen standardmäßig nicht abgefangen, und sie sind ziemlich schwer zu fangen (hauptsächlich, weil die meisten Hardwaresignale sind und in Ausnahmen übersetzt werden müssen).

Hier ist was ich getan habe:
- Aktivieren Sie die SEH-Ausnahmebehandlung
  (Eigenschaften / Codegenerierung / C ++ aktivieren Ausnahmen: Ja mit SEH-Ausnahmen)
- Aktivieren Sie Gleitkommaausnahmen mit _controlfp

Ich fange jetzt die Ausnahmen (wie in dem Beispiel unten gezeigt, das eine einfache Division durch Null-Ausnahme ist). Sobald ich jedoch diese Ausnahme abfange, scheint das Programm irreversibel beschädigt zu sein (da die einfache Float-Initialisierung sowie std :: cout nicht funktionieren!).

Ich habe ein einfaches Demo-Programm erstellt, das dieses seltsame Verhalten zeigt.

Hinweis: Dieses Verhalten wurde auf mehreren Computern reproduziert.

%Vor%

Hat jemand eine Ahnung, was getan werden könnte, um diese Situation zu korrigieren? Vielen Dank im Voraus!

    
Pascal T. 26.11.2010, 02:49
quelle

2 Antworten

10

Sie müssen die FPU-Ausnahmeflags im Statuswort löschen, wenn Sie eine Gleitkommaausnahme abfangen. Rufen Sie _clearfp () auf.

Verwenden Sie _set_se_translator (), um einen Ausnahmefilter zu schreiben, der die Hardwareausnahme in eine C ++ - Ausnahme übersetzt. Achten Sie darauf, selektiv zu sein, übersetzen Sie nur die FPU-Ausnahmen.

    
Hans Passant 26.11.2010, 18:12
quelle
1

Zusätzliche Informationen: Wenn Sie 32-Bit-Code in 64-Bit-Fenstern ausführen und / arch: SSE2 oder andere Optionen verwenden, die den SSE2-Befehlssatz oder einen seiner Obermengen aktivieren, müssen Sie möglicherweise drastischer vorgehen zurücksetzen.

Mit Visual Studio 2015 (und vermutlich späteren Versionen) müssen Sie _fpreset () nach in den SSE2-Registern generierten Gleitkomma-Traps aufrufen und nicht nur _clearfp (). Wenn Sie dies mit Visual Studio 2013 und früher tun, erhalten Sie eine Vielzahl von seltsamen Problemen, die durch die Run-Time-Library verursacht werden, die verwirrt wird.

    
John Dallman 01.02.2017 17:28
quelle