-
4 votesanswersviews
union for uint32_t和uint8_t [4]未定义的行为? [重复]
这个问题在这里已有答案: Purpose of Unions in C and C++ 14个答案 在this answer的注释中,据说使用如下的联合将整数拆分为它们的字节将是未定义的行为 . 在那个地方给出的代码是相似的,虽然与此不相同,如果我更改了代码的未定义行为相关方面,请注意 . union addr { uint8_t addr8[4]; uint32_t addr32; };... -
23 votesanswersviews
union 'punning' structs w /“common initial sequence”:为什么C(99)而不是C规定'visible declaration of the union type'?
背景 通过 union 讨论关于类型惩罚的大多数未实现定义的性质,通常引用以下位,通过@ecatmur(https://stackoverflow.com/a/31557852/2757035),对具有"common initial sequence"成员类型的标准布局 struct 进行豁免: C11(6.5.2.3结构和联合成员;语义):[...]如果一个联合包含几个共享... -
21 votesanswersviews
关于C中类型惩罚的意见?
我很好奇C中的类型惩罚指针/数组的约定 . 这是我目前的用例: 通过将二进制数据块视为32位整数数组(我们知道它的总长度是4的倍数),然后将所有值相加并忽略溢出,计算二进制blob数据的简单32位校验和 . 我希望这样的函数看起来像这样: uint32_t compute_checksum(const char *data, size_t size) { const uint32_t ... -
5 votesanswersviews
输入punning,char []和解除引用
我有一个旨在存储用户定义数据(即来自插件)的结构 . 它有一个具有给定最大大小的 char[] 来存储该数据 . struct A { // other members omitted // data meant to be type punned, only contains PODs char data[256]; }; 然后是一个示例用户结构,它具有从 A 强制转换... -
55 votesanswersviews
是否通过C99中未指定的联合进行类型惩罚,并且它是否在C11中指定?
Stack Overflow问题Getting the IEEE Single-precision bits for a float的一些答案建议使用 union 结构进行类型惩罚(例如:将 float 的位转换为 uint32_t ): union { float f; uint32_t u; } un; un.f = your_float; uint32_t target = ... -
18 votesanswersviews
使用void *键入punning而不破坏C99中的严格别名规则
我最近遇到了严格的别名规则,但我无法理解如何使用 void * 来执行类型惩罚而不违反规则 . 我知道这违反了规则: int x = 0xDEADBEEF; short *y = (short *)&x; *y = 42; int z = x; 而且我知道我可以安全地使用C99中的联合进行类型惩罚: union{ int x; short y; } data; da... -
3 votesanswersviews
输入punning Vs Union成员访问权限
按此https://stackoverflow.com/a/1812932/1814023 writing one member of union and reading another member is undefined behavior. 并按此https://stackoverflow.com/a/11640603/1814023 type punning is allowed in... -
1 votesanswersviews
C类打字课
我正在编写一些包含std :: unordered_map类型的C代码,我希望隐藏底层类型并将其作为另一种类型呈现 . 更具体地说,我想用std :: unordered_map用另一种类型包装std :: pair . 为了论证,让我们假设包装器看起来像这样...... template <typename ActualT > class wrapper final { privat... -
702 votesanswersviews
什么是严格别名规则?
在询问common undefined behavior in C时,灵魂比我提到的严格别名规则更开明 .他们在说什么? -
4 votesanswersviews
当CAN我打破别名规则?
我收到了这个警告 . 我想定义行为,但我想保持这个代码的原样 . 什么时候可以打破别名规则? 警告:解除引用类型惩罚指针将破坏严格别名规则[-Wstrict-aliasing] String是我自己的字符串,它是一个POD . 此代码从C调用.S可能是int . 字符串几乎是 struct String { RealString*s; } 但是模板和辅助函数 . 我做一个静态断言来确保Stri... -
0 votesanswersviews
打字警告
我想做这样的事情: #define EQ4(a_,b_) (*(int*)(a_)==*(int*)(b_)) char *s1 = "food"; char *s2 = "fred"; return EQ4(s1,s2); 但是gcc正在产生这个警告:警告:解除引用类型惩罚指针将破坏严格别名规则 . 我不认为我所做的事情被视为出于严格别名的目的而被解... -
2 votesanswersviews
解决GCC警告:“通过临时指针解除引用类型 - 惩罚指针将破坏严格别名规则”
在功能 size_t csps_socket_read(csps_socket_t *s, csps_packet_wrapper_t *packet, size_t sz) 我收到警告:“取消引用类型惩罚指针将破坏以下行中的严格别名规则[-Wstrict-aliasing]”: packet_size = ((csps_packet_full_header_t *)s->receive_... -
2 votesanswersviews
类型 - 正确地在不兼容但等效的结构内部指针
我的目标是这样的: void alloc(*x) { x->ptr = malloc(100); } int main() { struct { int z; int *ptr; } foo; struct { int z; double *ptr; } bar; alloc(&foo); alloc(&bar); retu... -
1 votesanswersviews
WinAPI将POD与基本类型联合起来:依赖于实现还是符合标准?
在处理Windows API时,当需要大量数据时,经常会遇到结构 . MSDN文档鼓励在这些结构上使用union punning将它们转换为基本类型 . 这些转换是否符合标准,或MSDN是否建议可能导致未定义行为的技术? 例如,当处理FILETIME结构并且需要完成算术时,the MSDN documentation建议: 建议您不要在FILETIME结构中添加和减去值以获得相对时间 . 相反... -
11 votesanswersviews
基于通用char []的存储并避免与严格别名相关的UB
我'm trying to build a class template that packs a bunch of types in a suitably large char array, and allows access to the data as individual correctly typed references. Now, according to the standard ... -
702 votesanswersviews
什么是严格别名规则?
在询问common undefined behavior in C时,灵魂比我提到的严格别名规则更开明 .他们在说什么? -
1 votesanswersviews
为什么这种类型的惩罚不是未定义的行为?
这是一个玩具示例,我认为会调用未定义的行为: #include <cstdint> #include <iostream> #include <vector> int main() { std::vector<uint16_t> foo = {0, 0x42F6}; std::cout << *reinterpret_c... -
4 votesanswersviews
C型双关语问题
如何为uint8_t,uint16_t,uint32_t,int8_t,int16_t,int32_t和float_t设置以下函数的通用性? 我不喜欢在每种情况下重复相同的逻辑,你可以看到 . 每种情况的唯一区别是铸造 . 理想情况下,我喜欢符合C标准的解决方案,因此便携 . 欢迎任何想法 . 谢谢 . static bool_t IsWithinLimits(const dbKey_t *key... -
19 votesanswersviews
修复取消引用类型惩罚指针将破坏严格别名
我正在尝试使用GCC编译特定程序时修复两个警告 . 警告是: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] 而这两个罪魁祸首是: unsigned int received_size = ntohl (*((unsigned int*)dcc->i... -
-1 votesanswersviews
什么是打字?类型惩罚如何与C中的工会一起使用?
任何人都可以解释一下C中的 type punning ,并通过一个简单的示例程序演示何时出现此类问题? 我在很多网站上搜索过(甚至维基),但即便如此,我也无法理解 . -
43 votesanswersviews
工会和打字
我一直在寻找,但找不到明确的答案 . 很多人说使用工会来打字 - 双关语是不明确和不好的做法 . 为什么是这样?考虑到你写入原始信息的内存并不仅仅是改变自己的一致性,我看不出为什么它会做任何未定义的任何原因(除非它超出了堆栈的范围,但这不是一个联合问题,那将是糟糕的设计) . 人们引用严格的别名规则,但在我看来,就像说你不能这样做,因为你做不到 . 如果不打双关语,联盟的意义何在?我在某个地方看到... -
2 votesanswersviews
`volatile`是否允许与工会打字?
我们都知道像这样打字 union U {float a; int b;}; U u; std::memset(u, 0, sizeof u); u.a = 1.0f; std::cout << u.b; 是C中未定义的行为 . 它是未定义的,因为在 u.a = 1.0f; 赋值后 .a 变为活动字段且 .b 变为非活动字段,并且从非活动字段读取它是未定义的行为 . 我们都知道这一点... -
3 votesanswersviews
这种类型是否定义明确?
在this answer中阅读关于严格别名规则的引用,我看到C 11的以下内容: 如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义:...聚合或联合类型,其中包含其元素中的上述类型之一或非静态数据成员(包括递归地,子聚合或包含联合的元素或非静态数据成员),... 所以我认为以下代码不会破坏严格的别名规则: #include <iostream> #in... -
4 votesanswersviews
可以通过标记变量volatile来修复不安全类型的惩罚吗?
在zwol对Is it legal to implement inheritance in C by casting pointers between one struct that is a subset of another rather than first member?的回答中,他给出了一个例子,说明为什么类似结构之间的简单类型转换是不安全的,并且在注释中有一个样本环境,它在其中出现意外...