Ich habe einen sehr einfachen Code geschrieben, um ein 32x32 16bpp-Bild mit einem konstanten Wert (1024) zu füllen. Der Image-Puffer wird von einem std::vector
gehostet. Die Tonhöhe / Schritt meines Bildes (d. H. Die Anzahl der Bytes zwischen zwei aufeinanderfolgenden Zeilen) ist groß genug, um eine ganze Zeile aufzunehmen, ist aber eine ungerade Zahl . Hier ist mein Code:
Ich benutze Linux x86_64 mit gcc 4.6.1 (Ubuntu 11.10). Der Code läuft gut mit den Optimierungsstufen -O0
, -O1
und -O2
. Valgrind meldet keine Zugriffsverletzung. Sobald ich jedoch auf -O3
umschalte oder die Option -ftree-vectorize
für die automatische Vektorisierung verwende, stürzt das Programm ab:
Weder gdb noch valgrind liefern hilfreiche Informationen:
%Vor% Der Absturz tritt nicht auf, wenn ich mit dem Flag -m32
gcc zu 32-Bit-Binärdateien wechsle. Es tritt auch nicht auf, wenn ich eine gerade Tonhöhe verwende (z. B. pitch = width * 2 + 2
). Könnte mir jemand helfen, den (sicherlich dummen) Fehler zu erkennen, den ich in meinem Code mache? Vielen Dank im Voraus!
UPDATE: Wie von Jonathan vorgeschlagen, habe ich dieses Problem gerade den GCC-Entwicklern gemeldet: Ссылка
Meine Frage wurde von Richard Blener auf dem gcc Bugzilla beantwortet:
"Sie deneferenzieren einen Zeiger auf uint16_t, der für diesen Typ nicht ausreichend ausgerichtet ist. Der C-Standard verbietet dies, was zu undefiniertem Verhalten führt."
Meiner Meinung nach sollte jedoch eine Warnung über dieses undefinierte Verhalten generiert werden. Bitte beachten Sie auch, dass diese Erklärung auch von @jmetcalfe in den Kommentaren zu diesem Beitrag gegeben wurde.
Tags und Links optimization c++ g++