Gefährlicher Fehler Visual C ++ 2005

8

Ich habe mit Visual Studio 2005, auf dem eine C ++ Win32-Konsolenanwendung läuft, einen sehr ernsten Fehler gemacht. Das Problem wird angezeigt, wenn Sie den folgenden Code ausführen (vereinfacht), indem Sie die folgenden Projekteigenschaften verwenden: C ++ | Optimierung | Optimierung | / O2 (oder / O1, oder / Ox), C ++ | Optimierung | Optimierung des gesamten Programms | / GL, Linker | Optimierung | / ltcg

%Vor%

Der Ausgang zeigt, dass der Wert 10 kleiner ist als der Wert 10! Ich habe bereits herausgefunden, dass das Ändern der Einstellung / O2 auf / Od das Problem löst (Einstellung / Og, die Teil von / O2 ist, verursacht das Problem), aber das verlangsamt wirklich die Ausführungszeit. Auch das Ändern des Codes ein bisschen kann es lösen, aber hey, ich kann nie sicher sein, dass der Code zuverlässig ist. Ich benutze Visual Studio 2005 Professional (Version 8.0.50727.867), Windows 7. Meine Fragen sind: Kann jemand versuchen, diesen Fehler mit Visual Studio 2005 zu reproduzieren, (ich habe bereits versucht, VS 2010, kein Problem), und wenn ja, was passiert hier? Kann ich davon ausgehen, dass neuere Versionen dieses Problem gelöst haben (ich erwäge den Kauf von VS 2012) Danke

    
user2791027 18.09.2013, 11:34
quelle

1 Antwort

3

Sie können Ihr Beispiel signifikant reduzieren und trotzdem das gleiche Problem bekommen! Sie benötigen nicht zwei Instanzen, und Sie benötigen keine der anderen lokalen Variablen oder Mitgliedsvariablen. Außerdem können Sie MAXVAL fest codieren.

Kurze Zusammenfassung dessen, was das Problem "löst":

  • macht MAXVAL ein nicht-const int
  • Setzen von setupVal2 auf einen Wert kleiner als 10
  • überraschend, Ändern der Bedingung 10<val zu val>10 !!!

Hier ist meine minimale Version, um das Problem zu reproduzieren:

%Vor%

Das Problem, wie es bei der Disassemblierung beobachtet wird, ist, dass der Compiler denkt, dass 10<val immer wahr ist und daher die Prüfung auslässt.

%Vor%     
us2012 18.09.2013 13:29
quelle