LLVM-Optimierungsfehler oder undefiniertes Verhalten?

9

Beim Zusammenstellen eines größeren Projekts mit Klängen bin ich auf einen irritierenden Fehler gestoßen.

Betrachten Sie das folgende kleine Beispiel:

%Vor%

Nach meinem besten Wissen verletzt dieser Code in keiner Weise den C-Standard, obwohl die letzte Zeile peinlich erscheint (im aktuellen Projekt erscheint Code wie dieser wegen übermäßiger Verwendung von Präprozessor-Makros).

Das Kompilieren mit clang (Version 3.1 oder höher) auf der Optimierungsebene -O1 oder höher führt dazu, dass Code an die falsche Position im Speicher geschrieben wird.

Die entscheidenden Teile der von clang / LLVM erzeugten Assemblydatei lauten wie folgt: (Dies ist GAS-Syntax, also für diejenigen von Ihnen, die an Intel gewöhnt sind: Vorsicht!)

%Vor%

Mit anderen Worten, die Anweisungen tun

%Vor%

anstelle der letzten oben geschriebenen Zeile. Die Wahl von + 5 ist beliebig, das Hinzufügen (oder Subtrahieren) anderer Ganzzahlen führt zu demselben Verhalten. Also - ist das ein Fehler in der LLVM-Optimierung oder gibt es hier ein undefiniertes Verhalten?

Bearbeiten: Beachten Sie auch, dass der Fehler verschwindet, wenn ich den Cast (unsigned char*) in der letzten Zeile weglasse. Im Allgemeinen scheint der Fehler sehr empfindlich auf Änderungen zu reagieren.

    
m_l 07.03.2013, 19:55
quelle

1 Antwort

5

Ich bin mir ziemlich sicher, dass dies ein Optimierungsfehler ist. Es ist in LLVM-2.7 und LLVM-3.1, die einzigen Versionen, auf die ich zugreifen kann.

Ich habe einen Fehler auf den LLVM Bugzilla gepostet.

Der Fehler wird von diesem SSCCE demonstriert:

%Vor%

Es sollte gedruckt werden

%Vor%

unter GCC und "clang -O0". Die falsche Ausgabe, die mit LLVM beobachtet wird, ist

%Vor%

Danke, dass Sie das bemerkt haben!

    
nneonneo 07.03.2013, 22:11
quelle

Tags und Links