GCC __attribute __((模式(XX))实际上做了什么?

22 c attributes c99 bignum

这源于今天早些时候关于bignum库和gcc特定的C语言攻击主题的问题.具体来说,使用了这两个声明:

typedef unsigned int dword_t __attribute__((mode(DI)));
Run Code Online (Sandbox Code Playgroud)

在32位系统和

typedef unsigned int dword_t __attribute__((mode(TI)));
Run Code Online (Sandbox Code Playgroud)

在64位系统上.

我假设这是对C语言的扩展,没有办法实现它在当前(C99)标准中实现的任何目标.

所以我的问题很简单:这个假设是否正确?这些陈述对底层内存有何影响?我认为结果是我2*sizeof(uint32_t)对于dword32位系统和2*sizeof(uint64_t)64位系统,我是否正确?

Mat*_*lin 28

这些允许您显式指定类型的大小,而不依赖于编译器或机器语义,例如"long"或"int"的大小.

它们在本页面上描述得相当不错.

我从那个页面引用:

QI:与最小可寻址单元一样宽的整数,通常为8位.

HI:一个整数,是QI模式整数的两倍,通常是16位.

SI:整数,是QI模式整数的四倍,通常是32位.

DI:整数,是QI模式整数的八倍,通常为64位.

SF:浮点值,与SI模式整数一样宽,通常为32位.

DF:浮点值,与DI模式整数一样宽,通常为64位.

所以DI基本上是sizeof(char) * 8.

这里TI可以找到包括模式在内的进一步说明(可能比第一个链接更好,但都提供了参考).

所以TI基本上是sizeof(char) * 16(128位).

  • 怎么样`__attribute __((mode(SD)))`? (2认同)