uintptr_t 与严格别名有什么关系?

What does uintptr_t have to do with strict aliasing?

我正在研究严格别名以及如何处理它,并在 DPDK 上找到 this commit

为了修复严格的别名(根据评论),他们将 void* 参数 srcdst 转换为 uintptr_t。然后使用铸造版本。

据我所知,这对严格的别名规则没有任何作用,因为规则本身没有提到转换为 uintptr_t

强制转换为 uintptr_t 真的有助于严格别名吗?或者这只是修复了 GCC 的一些可能的警告?

Would a cast to uintptr_t really help strict-aliasing?

不,不会。

Or would this just fix some possible warnings from GCC?

“修复”是指将严格别名违规伪装得足够好,以至于编译器不会对其进行诊断,是的,它可能会。并且大概它确实为做出该更改的人这样做了。

这是有害的,因为现在,编译器不仅可能对代码做一些不需要的事情,而且你甚至不能通过给它传递 -fno-strict-aliasing 选项(或不同的任何类似选项)来阻止它这样做编译器可能会提供)。更糟糕的是,它可能适用于今天使用的编译器,但在升级到新版本或切换到不同的 C 实现时数月或数年后就会中断。

“严格的别名规则”指定了以下情况:即使是不适合低级编程的实现 也必须允许看似无关的对象之间存在别名的可能性.被设计为适用于低级编程的编译器被允许并且将会通过有意义的行为来扩展语言——通常在比标准规定的更多情况下“以环境的记录时尚特征”处理构造,尤其是在存在通常无用的结构的情况下。

不打算以低级方式访问存储的程序相对较少会执行整数到指针的转换。因此,将此类转换视为它们应避免对由此形成的指针做出任何假设的指示的实现将能够比那些不这样做的程序有效地处理更广泛的程序,而不必放弃许多真正的机会 -有用的优化。虽然最好让标准指定一种语法来擦除指针来源的任何证据,但通过整数类型进行的转换目前适用于除 clang 之外的几乎所有编译器。