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.
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!