我試圖使用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=
參數,包括c11
,gnu11
,c99
和gnu99
,但沒有改變的行爲。)
[works here](http://coliru.stacked-crooked.com/a/1eee116d09555879) – 2014-10-08 21:37:39
@BryanChen你知道clang是什麼版本嗎?我注意到它是通過'clang ++'調用的。我也試過,但結果沒有改變。 – mpontillo 2014-10-08 21:40:42
看起來這不適用於Apple的clang或llvm-gcc - [提交錯誤報告](http://bugreport.apple.com)。 – 2014-10-08 21:42:57