2014-10-08 5 views
6

Ich versuche, eine bestimmte Funktion ohne Optimierung mit clang zu kompilieren, um bestimmte sicherheitsrelevante Aufrufe an memset() zu vermeiden weg optimiert werden.In Clang, wie verwenden Sie pro Funktionsoptimierung Attribute?

Gemäß the documentation that can be found here existiert ein optnone Attribut, das dies ermöglicht. Auch an example can be found here.

Leider (zumindest auf der unten Version von clang, auf OS X 10.9.5), ist dies Compiler-Warnungen verursacht, wie in diesem Beispiel zu sehen ist:

$ clang --version 
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn) 
Target: x86_64-apple-darwin13.4.0 
Thread model: posix 

$ cat optnone.c 
#include <string.h> 

__attribute__((optnone)) void* 
always_memset(void *b, int c, size_t len) 
{ 
    return memset(b, c, len); 
} 

$ clang -Wall -O3 -c -o optnone.o optnone.c 
optnone.c:3:16: warning: unknown attribute 'optnone' ignored [-Wattributes] 
__attribute__((optnone)) void* 
      ^
1 warning generated. 

Ich habe auch versucht #pragma clang optimize off mit , aber dies verursachte eine unknown pragma ignored Warnung.

Weiß jemand, warum das nicht funktioniert? Habe ich eine Voraussetzung für die Verwendung dieser Funktion verpasst? (Ich habe auch versucht, verschiedene -std= der Parameter wie c11, gnu11, c99 und gnu99, aber nichts verändert das Verhalten.)

+0

[funktioniert hier] (http://coliru.stacked-crooked.com/a/1eee116d09555879) –

+0

@BryanChen wissen Sie, welche Version von Clang das ist? Ich habe bemerkt, dass es über 'clang ++' aufgerufen wird. Ich habe das auch versucht, aber keine Änderung meiner Ergebnisse. – mpontillo

+1

Es sieht so aus, als ob dies nicht mit apples clang oder llvm-gcc funktioniert - [file a bug report] (http://bugreport.apple.com). –

Antwort

4

Wie Klirren Dokumentation sagt,

Clang unterstützt Gnu Attribut Namespace des GCC. Alle GCC-Attribute, die mit der __attribute__((foo))-Syntax akzeptiert werden, werden auch als [[gnu::foo]] akzeptiert. Dies gilt nur für Attribute, die von GCC angegeben werden (siehe Liste der GCC-Funktionsattribute, GCC-Variablenattribute und GCC-Typattribute). Wie bei der GCC-Implementierung müssen diese Attribute in einer Deklaration der Deklarator-ID zugeordnet sein, dh sie müssen entweder am Anfang der Deklaration oder unmittelbar nach der Deklaration des Namens stehen. Versuchen

void* always_memset(void *b, int c, size_t len) [[gnu::optimize(0)]] 

oder

void* always_memset(void *b, int c, size_t len) __attribute__ ((optimize("0"))); 
+9

Sie sollten stattdessen '__attribute__ ((optnone)) '' versuchen, 'optimize (" 0 ")' ist auf meinem Rechner nicht definiert – dulaccc

0

Wie @dulacc in seinem Kommentar befürwortete, __attribute__ ((optnone)) Werke auf Klirren 9.0.0 auf Mac High Sierra.

Verwandte Themen