我正在尝试使用 clang
编译一个没有优化的特定函数,以防止对 memset()
的某些与安全相关的调用被优化掉。
根据 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
,但没有任何改变行为。)
最佳答案
正如@dulacc 在他的评论中所提倡的那样,__attribute__ ((optnone))
在 Mac 的 High Sierra 上适用于 clang 9.0.0。
关于c - 在 clang 中,如何使用每个函数的优化属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50391633/