[Qt 4: MSVC] Division durch Null
Verfasst: 27. August 2005 13:28
Wieviel Zeit muss man eigentlich investieren, bis man eine Division durch Null findet?
Ich habe hier ein Qt Programm, dass eine DLL mit LoadLibrary lädt. Und nachdem ich diese geladen habe, schlägt mir das Programm "unknown software exception" um die Ohren. Beim Debuggen stellte ich dann fest, dass dieses "unknown software exception" nichts anderes als eine "Division durch Null" ist. Und die trat in qstroker.cpp::qt_curves_for_arc() auf.
Was war passiert. Die DLL setzt das Statuswort der FPU so, dass Exceptions ausgelöst werden, wenn eine Division durch Null auftritt.
Aktiviert man die Exceptions, so treten einige Fehler in Qt zum Vorschein. Dort wird (will fast sagen: wie wild) durch Null geteilt ohne das vorher zu überprüfen.
Ich habe dann mal zur Gaudi das in qglobal.cpp eingebaut. Und als ich dann Qt neu bauen wollte, kam es zu "unknown software exception" in rcc.exe während er tools\porting kompilierte. Das Problem ist, dass die *.resource Dateien alle 0 Bytes haben und weil durch die Dateigröße dividiert wird, kommt die Exception zu Tage.
EDIT: Hier noch ein Beispielprogramm:
Ich habe hier ein Qt Programm, dass eine DLL mit LoadLibrary lädt. Und nachdem ich diese geladen habe, schlägt mir das Programm "unknown software exception" um die Ohren. Beim Debuggen stellte ich dann fest, dass dieses "unknown software exception" nichts anderes als eine "Division durch Null" ist. Und die trat in qstroker.cpp::qt_curves_for_arc() auf.
Was war passiert. Die DLL setzt das Statuswort der FPU so, dass Exceptions ausgelöst werden, wenn eine Division durch Null auftritt.
Code: Alles auswählen
_control87(!_EM_ZERODIVIDE, MCW_EM);Ich habe dann mal zur Gaudi das in qglobal.cpp eingebaut. Und als ich dann Qt neu bauen wollte, kam es zu "unknown software exception" in rcc.exe während er tools\porting kompilierte. Das Problem ist, dass die *.resource Dateien alle 0 Bytes haben und weil durch die Dateigröße dividiert wird, kommt die Exception zu Tage.
EDIT: Hier noch ein Beispielprogramm:
Code: Alles auswählen
#include <iostream>
#include "float.h"
int main()
{
//_clear87();
_control87(!_EM_ZERODIVIDE, MCW_EM);
double x = 0;
int y = 10 / x;
std::cout << y << std::endl;
return 0;
}