c - 在 clang 中,如何使用每个函数的优化属性?

标签 c clang compiler-optimization

我正在尝试使用 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= 参数,包括 c11gnu11c99gnu99,但没有任何改变行为。)

最佳答案

正如@dulacc 在他的评论中所提倡的那样,__attribute__ ((optnone)) 在 Mac 的 High Sierra 上适用于 clang 9.0.0。

关于c - 在 clang 中,如何使用每个函数的优化属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50391633/

相关文章:

c++ - 围绕数组放置新运算符的括号

c++ - 如何制作干净的clang前端?

c++ - 为什么增强的 GCC 6 优化器会破坏实用的 C++ 代码?

c - 为什么main在没有变量的情况下初始化堆栈帧

c - 多线程从一个管道读取

c - 带指针的语句似乎缺少运算符

windows - 在 Windows 上使用 CMake、Ninja 和 Clang 构建

c++ - g++ -O 优化

c - 打印数据并给出开始和结束

c - 步进电机控制时序