strict-aliasing相关内容
违反严格别名规则会产生未定义的行为,例如,通过网络将结构发送到字符缓冲区,然后该字符指针被C样式/std::reinterpret_cast()强制转换为结构指针。 C++std::bit_cast() function看起来可以用来在(实现?)定义的方式,即不违反严格的别名规则。 示例: #include #include
..
C++20的严格的别名规则[basic.lval]/11是否任意允许... 在char*和char8_t*之间强制转换 string str = "string"; u8string u8str { (char8_t*) &*str.data() }; // c++20 u8string u8string u8str2 = u8"zß水🍌" string str2 { (char*
..
注意:学习严格的别名规则。请耐心等待。 代码示例(t935.c): #include int f(int* pi, double* pd) { *pi = 13; *pd = 7E-323; return *pi; } int main(void) { union { int i; double d; } u; print
..
..
我试图编写一些宏以安全地使用 _Bool,然后对我的代码进行压力测试.为了邪恶的测试目的,我想出了这个肮脏的黑客: _Bool b=0;*(无符号字符*)&b = 42; 鉴于 _Bool 在实现 sizeof(_Bool)==1) 上是 1 个字节,我看不出这种 hack 是如何违反 C 标准的.这不应该是严格的别名违规. 然而,当通过各种编译器运行这个程序时,我遇到了问题: #in
..
你有什么恐怖故事要讲吗?GCC 手册最近添加了一条关于 -fstrict-aliasing 和通过联合强制转换指针的警告: [...] 获取地址、转换结果指针并取消引用结果具有未定义的行为 [强调添加],即使转换使用联合类型,例如: union a_union {诠释我;双 d;};诠释 f() {双 d = 3.0;返回 ((联合 a_union *)&d)->i;} 有没有人可以举
..
我试图在不调用未定义行为的情况下从浮点数中提取位.这是我的第一次尝试: 无符号 foo(float x){无符号* u = (无符号*)&x;返回 *u;} 据我了解,由于严格的别名规则,这不能保证有效,对吧?如果使用字符指针进行中间步骤,它是否有效? 无符号条形(float x){char* c = (char*)&x;无符号* u = (无符号*)c;返回 *u;} 还是我必须自己提取
..
即使在阅读了很多关于严格别名规则的内容后,我仍然感到困惑.据我了解,不可能实现遵循这些规则的合理内存分配器,因为 malloc 永远不能重用已释放的内存,因为内存可用于在每次分配时存储不同类型. 显然这是不对的.我错过了什么?您如何实现遵循严格别名的分配器(或内存池)? 谢谢. 编辑:让我用一个愚蠢的简单例子来澄清我的问题: //s == 0 释放池void *my_custo
..
以前,在 basic.lval 中,有这个要点: 在其元素或非静态数据成员中包含上述类型之一的聚合或联合类型(递归地包括子聚合或包含联合的元素或非静态数据成员), 在当前的草案中,它已经消失了. WG21 的网站上有一些背景信息:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1359r0.html#2051:
..
我们最近在大学举办了一场关于多种语言的编程专题讲座. 讲师写下了以下函数: inline u64 Swap_64(u64 x){u64 tmp;(*(u32*)&tmp) = Swap_32(*(((u32*)&x)+1));(*(((u32*)&tmp)+1)) = Swap_32(*(u32*) &x);返回 tmp;} 虽然我完全理解这在可读性方面也是非常糟糕的风格,但他的主要观点
..
我的问题的背景是网络编程.假设我想在两个程序之间通过网络发送消息.为简单起见,假设消息看起来像这样,并且字节顺序不是问题.我想找到一种正确、可移植且有效的方法来将这些消息定义为 C 结构.我知道有四种方法可以解决这个问题:显式转换、通过联合转换、复制和封送. struct message {uint16_t 逻辑 ID;uint16_t 命令;}; 显式转换: void send_messa
..
关于类型双关的问题:为什么这段代码违反了严格的别名规则: 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
..
你有什么恐怖故事要讲吗?GCC 手册最近添加了关于 -fstrict-aliasing 和通过联合转换指针的警告: [...] 获取地址、转换结果指针并取消引用结果具有未定义行为 [强调添加],即使转换使用联合类型,例如: union a_union {国际我;双d;};int f() {双 d = 3.0;return ((union a_union *)&d)->i;} 有没有人举
..
在 gcc-strict-aliasing-and-casting-through-a-union 我问是否有人遇到过通过指针进行联合双关语的问题.到目前为止,答案似乎是否. 这个问题更广泛:你有任何关于 gcc 和严格别名的恐怖故事吗? 背景:引用 AndreyT 在 c99-strict 中的回答-aliasing-rules-in-c-gcc: "严格的别名规则植根于自 [
..
我使用以下代码从文件中读取数据,作为更大程序的一部分. double data_read(FILE *stream,int code) {字符数据[8];开关(代码){案例0x08:返回(无符号字符)fgetc(流);案例0x09:返回(有符号字符)fgetc(流);案例0x0b:数据[1] = fgetc(stream);数据[0] = fgetc(stream);返回*(短*)数据;案例0x
..
我一直试图理解严格的别名规则,因为它们适用于字符指针. 此处声明如下: 总是假定 char* 可以指代任何对象的别名. 好吧,在套接字代码的上下文中,我可以这样做: struct SocketMsg{一个;国际b;};int main(int argc, char** argv){//一些代码...SocketMsg msgToSend;msgToSend.a = 0;msgT
..
按照我之前的问题,我'我真的对这段代码很好奇 - case AF_INET:{结构 sockaddr_in * tmp =reinterpret_cast(&addrStruct);tmp->sin_family = AF_INET;tmp->sin_port = htons(port);inet_pton(AF_INET, addr, tmp->sin_addr);}休息; 在问这个问题之前
..
我无法解释这个程序的执行行为: #include #include #include typedef 字符 u8;typedef unsigned short u16;size_t f(u8 *keyc, size_t len){u16 *key2 = (u16 *) (keyc + 1);size_t 哈希 = len;len = len/2;for (size_t i = 0; i
..
C 标准读取 (J.2) 中未定义行为的示例之一: ——数组下标超出范围,即使对象显然可以通过给定下标(如左值表达式 a[1][7] 给定声明 inta[4][5]) (6.5.6) 如果声明从int a[4][5]改为unsigned char a[4][5],是否访问a[1][7] 仍然导致未定义的行为?我的观点是它没有,但我从其他人那里听到了不同意的声音,我想看看其他一些潜在的
..
我正在阅读 ISO/IEC 9899:TC2 中 6.5 的第 7 段. 它允许通过以下方式对对象进行左值访问: 包含上述之一的聚合或联合类型其成员之间的类型(包括递归地,子聚合或包含联合), 请参考文档了解“上述"类型是什么,但它们肯定包括对象的有效类型. 它在一个注释为: 此列表的目的是指定在哪些情况下对象可能有别名也可能没有别名. 我认为(例如)以下内容是
..