2014-10-08 24 views
6

我試圖使用clang編譯一個沒有優化的特定函數,以防止某些與安全相關的調用memset()被優化掉。在clang中,你如何使用per-function優化屬性?

根據the documentation that can be found here,存在允許這種情況的optnone屬性。另外,an example can be found here

不幸的是,(至少在下面版本的clang,在OS X 10.9.5),這是導致編譯器警告,如在這個例子中可以看出:

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

我使用#pragma clang optimize off也嘗試,但這導致了unknown pragma ignored警告。

有誰知道爲什麼這不起作用?我錯過了使用此功能的先決條件嗎? (我也嘗試使用各種不同的-std=參數,包括c11gnu11c99gnu99,但沒有改變的行爲。)

+0

[works here](http://coliru.stacked-crooked.com/a/1eee116d09555879) – 2014-10-08 21:37:39

+0

@BryanChen你知道clang是什麼版本嗎?我注意到它是通過'clang ++'調用的。我也試過,但結果沒有改變。 – mpontillo 2014-10-08 21:40:42

+1

看起來這不適用於Apple的clang或llvm-gcc - [提交錯誤報告](http://bugreport.apple.com)。 – 2014-10-08 21:42:57

回答

4

由於鐺文件說,

鏘支持GCC的GNU屬性命名空間。所有被__attribute__((foo))語法接受的GCC屬性也被接受爲[[gnu::foo]]。這隻適用於由GCC指定的屬性(請參閱GCC功能屬性,GCC變量屬性和GCC類型屬性列表)。與GCC實現一樣,這些屬性必須屬於聲明中的聲明符id,這意味着它們必須在聲明開始時或聲明後立即進行。

嘗試對Mac的海伊謝拉上鐺9.0.0

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

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

您應該嘗試'__attribute__((optnone))'而不是'optimize(「0」)'在我的機器上未定義 – dulaccc 2015-10-03 09:28:52

0

正如在他的評論中所倡導@dulacc,__attribute__ ((optnone))作品。