Probleme mit VC6 Compiler (Debug Version unterscheidet sich funktional von der Release Version)
-
Moin,
ich habe folgendes Problem. Ich arbeite unter Windows XP Professional und entwickele momentan ein kleines Progrämmchen in VC6 mit der Windows API (ohne MFC) und der DirectX Bibliothek.
Ich benutze einige numerische labile Algorithmen, welche in gewissen Situationen recht anfällig auf Rundungsfehler reagieren. Beispielsweise benötige ich einen Punkt-Auf-Linie Test, welcher Probleme macht, sobald der Punkt in der Nähe (<10^-9 m) der Linie liegt. Wenn nun ein weiterer numerisch labiler Algorithmus den Punkt-Auf-Linie Test benötigt, kann dies ziemlich schnell ziemlich böse werden.
Nur durch die sehr sorgfältige Einführung von Epsilon Regionen konnte ich diese Probleme in den Griff bekommen.Nun tauchen einige Probleme auf. Kompiliere ich die Debug Version laufen alle Testfälle ohne Probleme durch. Kompiliere ich aber die Release Version laufen nicht alle Testfälle. Funktionen die in der Debug Version laufen, erzeugen in der Release Version einen Fehler, obwohl sie sich vom Code her nicht unterscheiden. Da aber wie schon gesagt, einige Funktionen numerisch labil sind, also auf Rundungsfehler recht übel reagieren, habe ich die Optimierungen in der Release Version in Verdacht.
Unter "Project Settings" habe ich deswegen mal die Optimierungen für die Release ausgeschaltet und blub: die Testfälle liefen alle wieder ohne Probleme. Danach habe ich die Optimierungen auf "Customize Optimizations" gestellt und ein paar Optimierungsschalter des Compilers von Hand gesetzt. Dabei fiehl mir auch, dass ein Sündenbock der Compilerschalter "Global Optimizations" ist. Sobald ich bei den Optimierungsschaltern nur diesen wähle, tauchen die Fehler in den Testfällen wieder auf.
Meine Fragen dazu:
- Weis jemand warum hier der VC6 Compiler offentsichtlich einen Fehler baut ?
- Wie kann man den Fehler beheben / abmildern ohne große Performance Verluste durch weggelassene Optimierungen hinnehmen zu müssen ?
- Gibt es irgentwo eine Referenz zu dem VC6 Compiler ?Danke
-
Ich habe die Lösung selbst gefunden.
Es lag daran dass ich über die Grenzen eines Arrays hinausgeschrieben bzw. gelesen habe. Das folgende Beispiel zeigt dies.
int a[10]; int n = 0; if (ConditionA) a[n++] = i; if (ConditionB) a[n++] = i + 1; ... for (int j = 0; j < 10; j++) // <-- Hier greife ich auf alle Werte zu obwohl die Anzahl in n steht printf("%i\n", j);
Das hatte zur Folge das ein Bit innerhalb einer Struktur gesetzt wurde, welches die Probleme verursachte. Ich vermute dass der Fehler deswegen nur in der Release auftauchte, weil der C++ Compiler eine unterschiedliche Speicherverwaltung zwischen Debug und Release macht.
-
Das richtige Beispiel ist natürlich
int a[10]; int n = 0; if (ConditionA) a[n++] = i; if (ConditionB) a[n++] = i + 1; ... for (int j = 0; j < 10; j++) // <-- Hier greife ich auf alle Werte zu obwohl die Anzahl in n steht printf("%i\n", a[j]);