Absturz beim Füllen eines 16-Bit-Bildes mit -O3-Optimierung und ungeraden Tonhöhen

9

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:

%Vor%

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:

%Vor%

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: Ссылка

    
Tisys 19.02.2013, 10:51
quelle

1 Antwort

4

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.

    
Tisys 19.02.2013 12:10
quelle

Tags und Links