strict-aliasing相关内容

_Bool 类型和严格别名

我试图编写一些宏以安全地使用 _Bool,然后对我的代码进行压力测试.为了邪恶的测试目的,我想出了这个肮脏的黑客: _Bool b=0;*(无符号字符*)&b = 42; 鉴于 _Bool 在实现 sizeof(_Bool)==1) 上是 1 个字节,我看不出这种 hack 是如何违反 C 标准的.这不应该是严格的别名违规. 然而,当通过各种编译器运行这个程序时,我遇到了问题: #in ..
发布时间:2022-01-19 17:35:02 其他开发

gcc、严格混叠和通过联合进行强制转换

你有什么恐怖故事要讲吗?GCC 手册最近添加了一条关于 -fstrict-aliasing 和通过联合强制转换指针的警告: [...] 获取地址、转换结果指针并取消引用结果具有未定义的行为 [强调添加],即使转换使用联合类型,例如: union a_union {诠释我;双 d;};诠释 f() {双 d = 3.0;返回 ((联合 a_union *)&d)->i;} 有没有人可以举 ..
发布时间:2022-01-12 23:42:25 其他开发

浮点位和严格的别名

我试图在不调用未定义行为的情况下从浮点数中提取位.这是我的第一次尝试: 无符号 foo(float x){无符号* u = (无符号*)&x;返回 *u;} 据我了解,由于严格的别名规则,这不能保证有效,对吧?如果使用字符指针进行中间步骤,它是否有效? 无符号条形(float x){char* c = (char*)&x;无符号* u = (无符号*)c;返回 *u;} 还是我必须自己提取 ..
发布时间:2022-01-09 10:40:51 C/C++开发

C 内存分配器和严格别名

即使在阅读了很多关于严格别名规则的内容后,我仍然感到困惑.据我了解,不可能实现遵循这些规则的合理内存分配器,因为 malloc 永远不能重用已释放的内存,因为内存可用于在每次分配时存储不同类型. 显然这是不对的.我错过了什么?您如何实现遵循严格别名的分配器(或内存池)? 谢谢. 编辑:让我用一个愚蠢的简单例子来澄清我的问题: //s == 0 释放池void *my_custo ..
发布时间:2021-12-24 17:05:31 其他开发

“包含上述类型之一的聚合或联合类型"发生了什么?严格的别名规则?

以前,在 basic.lval 中,有这个要点: 在其元素或非静态数据成员中包含上述类型之一的聚合或联合类型(递归地包括子聚合或包含联合的元素或非静态数据成员), 在当前的草案中,它已经消失了. WG21 的网站上有一些背景信息:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1359r0.html#2051: ..
发布时间:2021-12-23 17:02:32 C/C++开发

为什么优化会杀死这个功能?

我们最近在大学举办了一场关于多种语言的编程专题讲座. 讲师写下了以下函数: inline u64 Swap_64(u64 x){u64 tmp;(*(u32*)&tmp) = Swap_32(*(((u32*)&x)+1));(*(((u32*)&tmp)+1)) = Swap_32(*(u32*) &x);返回 tmp;} 虽然我完全理解这在可读性方面也是非常糟糕的风格,但他的主要观点 ..
发布时间:2021-12-20 15:42:16 C/C++开发

将缓冲区解释为结构的正确、可移植的方式

我的问题的背景是网络编程.假设我想在两个程序之间通过网络发送消息.为简单起见,假设消息看起来像这样,并且字节顺序不是问题.我想找到一种正确、可移植且有效的方法来将这些消息定义为 C 结构.我知道有四种方法可以解决这个问题:显式转换、通过联合转换、复制和封送. struct message {uint16_t 逻辑 ID;uint16_t 命令;}; 显式转换: void send_messa ..
发布时间:2021-12-20 10:47:05 其他开发

C 中的严格别名

关于类型双关的问题:为什么这段代码违反了严格的别名规则: int main(){int a = 1;短j;printf("%i\n", j = *((short*)&a));返回0;} 这不是: int main(){int a = 1;短j;国际*p;p=&a;printf("%i\n", j = *((short*)p));返回0;} 通过 gcc -fstrict-aliasing ..
发布时间:2021-12-18 23:17:16 其他开发

gcc、严格别名和通过联合进行强制转换

你有什么恐怖故事要讲吗?GCC 手册最近添加了关于 -fstrict-aliasing 和通过联合转换指针的警告: [...] 获取地址、转换结果指针并取消引用结果具有未定义行为 [强调添加],即使转换使用联合类型,例如: union a_union {国际我;双d;};int f() {双 d = 3.0;return ((union a_union *)&d)->i;} 有没有人举 ..
发布时间:2021-12-18 23:06:50 其他开发

gcc、严格别名和恐怖故事

在 gcc-strict-aliasing-and-casting-through-a-union 我问是否有人遇到过通过指针进行联合双关语的问题.到目前为止,答案似乎是否. 这个问题更广泛:你有任何关于 gcc 和严格别名的恐怖故事吗? 背景:引用 AndreyT 在 c99-strict 中的回答-aliasing-rules-in-c-gcc: "严格的别名规则植根于自 [ ..
发布时间:2021-12-18 22:28:16 其他开发

什么时候 char* 对严格指针别名是安全的?

我一直试图理解严格的别名规则,因为它们适用于字符指针. 此处声明如下: 总是假定 char* 可以指代任何对象的别名. 好吧,在套接字代码的上下文中,我可以这样做: struct SocketMsg{一个;国际b;};int main(int argc, char** argv){//一些代码...SocketMsg msgToSend;msgToSend.a = 0;msgT ..
发布时间:2021-12-11 11:49:14 其他开发

是无符号字符 a[4][5];[1][7];未定义的行为?

C 标准读取 (J.2) 中未定义行为的示例之一: ——数组下标超出范围,即使对象显然可以通过给定下标(如左值表达式 a[1][7] 给定声明 inta[4][5]) (6.5.6) 如果声明从int a[4][5]改为unsigned char a[4][5],是否访问a[1][7] 仍然导致未定义的行为?我的观点是它没有,但我从其他人那里听到了不同意的声音,我想看看其他一些潜在的 ..
发布时间:2021-11-18 05:08:53 其他开发

通过结构别名数组

我正在阅读 ISO/IEC 9899:TC2 中 6.5 的第 7 段. 它允许通过以下方式对对象进行左值访问: 包含上述之一的聚合或联合类型其成员之间的类型(包括递归地,子聚合或包含联合), 请参考文档了解“上述"类型是什么,但它们肯定包括对象的有效类型. 它在一个注释为: 此列表的目的是指定在哪些情况下对象可能有别名也可能没有别名. 我认为(例如)以下内容是 ..
发布时间:2021-11-18 03:06:54 其他开发