告诉编译器对齐没问题而不抑制警告的可移植方法?

jww*_*jww 3 c gcc casting clang compiler-warnings

我们运行的测试之一是使用-Wcast-align. 当浮点型、双精度型和积分型之间发生错误转换时,它特别有用(有时会导致SIGBUS, IIRC)。

我们的代码基本上执行以下操作。实际案例稍微复杂一些,但这就是用法的本质:

typedef uint64_t word64;

static const size_t SIZE = ...;
word64 buffer[SIZE] = ...;
Run Code Online (Sandbox Code Playgroud)

和:

DoSomethingWithBuffer(const byte* buff, size_t size)
{
    word64* ptr = (word64*)buff;
    ...
}
Run Code Online (Sandbox Code Playgroud)

缓冲区在 8 或 16 字节边界上对齐。我已经使用手动代码审查和运行时断言验证了对齐情况。

问题是 GCC 和 Clang 都警告数据未对齐。它这样做了近 2000 次,所以我可能会失去真正的发现。例如:

warning: cast from 'const byte *' (aka 'const unsigned char *') to 'word64 *'
(aka 'unsigned long long *') increases required alignment from 1 to 8 [-Wcast-align]
    word64 tmp = *(word64 *)inBlock ^ roundKeys[0];
                  ^~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

使用 Clang,我可以使用 an 进行检测assert,编译器有时会将其作为诊断提示。但它似乎不适用于本案。也就是说,Clang 不会建立assert(inBlock % 8 == 0);意味着其对齐的连接。

如何向编译器传达缓冲区已对齐而不抑制警告?

chu*_*ica 5

由于 OP 现有代码库不需要强类型匹配,简单地击败大多数类型匹配void*即可消除警告。也参考@Ctx

 void DoSomethingWithBuffer(const byte* buff, size_t size) {
   const word64* ptr = (void*) buff;
   ...
 }
Run Code Online (Sandbox Code Playgroud)