-
0 votesanswersviews
从成员函数指针转换到另一个类型和返回,严格别名问题?
我写了一个类来存储函数指针或成员函数指针(不是一次两者) . 当我存储成员函数指针时,我也存储了一个对象指针(接收器) . 问题是:我事先不知道对象的类型和函数签名,所以我使用模板typename . 对于参数,我使用可变参数模板 . 我有一个类似于这样的代码: template <typename... Args> class A { public: template <... -
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... -
702 votesanswersviews
什么是严格别名规则?
在询问common undefined behavior in C时,灵魂比我提到的严格别名规则更开明 .他们在说什么? -
2 votesanswersviews
boost :: bind打破严格别名规则?
使用Boost 1.43和GCC 4.4.3,代码如下 boost::bind(&SomeObject::memberFunc, this, _1)); 生成以下警告 boost / function / function_base.hpp:321:警告:解除引用类型惩罚指针将破坏严格别名规则 在没有设置-fno-strict-aliasing的情况下消除这些警告的正确方法是什么? -
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正在产生这个警告:警告:解除引用类型惩罚指针将破坏严格别名规则 . 我不认为我所做的事情被视为出于严格别名的目的而被解... -
29 votesanswersviews
这真的打破了严格别名规则吗?
当我使用g编译此示例代码时,我收到此警告: 警告:解除引用类型惩罚指针将破坏严格别名规则[-Wstrict-aliasing] 代码: #include <iostream> int main() { alignas(int) char data[sizeof(int)]; int *myInt = new (data) int; *myInt = 34; ... -
1 votesanswersviews
解除引用类型惩罚指针将破坏严格别名规则:字节数组到一个数字
我已经阅读了很多关于这个警告的问题(Dereferencing type-punned pointer will break strict-aliasing rules,Dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing],What is the strict aliasing ... -
0 votesanswersviews
警告!解除引用类型惩罚指针将破坏严格别名规则[-Wstrict-aliasing]
我有别名问题 . 我以前从未接触过它 . 我正在使用Eclipse CDT . 我读了不同的解决方案,但我找不到合适的解决方案 . 我有警告 解除引用类型惩罚指针将破坏严格别名规则[-Wstrict-aliasing] 所以我有以下代码和平: timestamp = st0 % 100000000; for (std::list<struct trace *>::iterator... -
1 votesanswersviews
为什么即使使用`char *`我也会收到“打字”警告?
gcc(6.3.1 20170109)编译以下程序时 #include <stdio.h> int main(int argc, const char *argv[]) { unsigned char x[] = {0x66, 0x19}; printf("%i\n", ((short *)((char *)&x[0]))[0]); ... -
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_... -
44 votesanswersviews
gcc,严格别名和恐怖故事
在gcc-strict-aliasing-and-casting-through-a-union中,我问是否有人通过指针遇到工会打击问题 . 到目前为止,答案似乎是否定的 . 这个问题更广泛:你有关于gcc和严格别名的恐怖故事吗? 背景:引自AndreyT's answer in c99-strict-aliasing-rules-in-c-gcc: “严格的别名规则植根于自[标准化]时代开始以... -
45 votesanswersviews
取消引用类型惩罚指针将破坏严格别名规则
我使用以下代码来从文件中读取数据,作为更大程序的一部分 . double data_read(FILE *stream,int code) { char data[8]; switch(code) { case 0x08: return (unsigned char)fgetc(stream); case 0x... -
51 votesanswersviews
“解除引用类型惩罚指针将破坏严格别名规则”警告
我使用一个代码,我将枚举*转换为int * . 像这样的东西: enum foo { ... } ... foo foobar; int *pi = reinterpret_cast<int*>(&foobar); 编译代码(g 4.1.2)时,我收到以下警告消息: dereferencing type-punned pointer will break strict-ali... -
3 votesanswersviews
调用free()包装器:解除引用类型惩罚指针将破坏严格别名规则
我试图在这里阅读其他类似 Headers 的问题,但是对于我来说,能够将解决方案(甚至解释)应用到我自己的问题上看起来有点过于复杂,这似乎是更简单的性质 . 在我的情况下,我有一个 free() 的包装器,它在释放后将指针设置为 NULL : void myfree(void **ptr) { free(*ptr); *ptr = NULL; } 在我正在研究的项目中,它被称为:... -
29 votesanswersviews
是否错误地指定了严格别名规则?
作为previously established,形式的联合 union some_union { type_a member_a; type_b member_b; ... }; n个成员在重叠存储中包含n个对象:一个对象用于union本身,一个对象用于每个union成员 . 很明显,您可以按任何顺序自由地读取和写入任何工会成员,即使读取的工会成员不是最后写入的工会成员... -
17 votesanswersviews
GCC和相同类型的数组之间的严格别名
上下文 以GCC优化命名的“严格别名”是编译器假设内存中的值不会通过类型的左值(“声明的类型”)访问,该值与写入的值的类型非常不同( “有效型”) . 如果必须考虑到写入指向 float 的指针可能会修改 int 类型的全局变量,则此假设允许代码转换不正确 . GCC和Clang都在a standard description full of dark corners中提取了最多的含义,并且在实践... -
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
联盟:从联盟的一个数据成员读取到另一个联盟
我知道对于下面的代码,下面的“非法”是未定义的(虽然有些编译器允许),因为联合成员“a”是活动的,然后我们从联合成员“b”读取 . 问题是,“AmILegal”中的代码是否解决了这个问题,还是我做了一些可怕而且更加模糊的事情?我可以使用memcpy来实现相同的效果,还是我在那里调用另一个未定义的行为? 编辑:也许这个例子不够清楚 . 我想做的就是激活其他成员 . 所以我将float更改为int .... -
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时,灵魂比我提到的严格别名规则更开明 .他们在说什么? -
4 votesanswersviews
c 11严格别名规则是否允许通过char *,char(&)[N]访问uint64_t,甚至std :: array <char,N>&with -fstrict-aliasing -Wstrict-aliasing = 2?
根据this stackoverflow回答关于 C++11/14 严格的别名规则: 如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义:对象的动态类型,对象的动态类型的cv限定版本,a类型(如4.4中所定义)类型为对象的动态类型,类型是对应的动态类型的有符号或无符号类型,类型是对应于cv限定版本的有符号或无符号类型对象的动态类型,聚合或联合类型,包括其元素或非静态数... -
21 votesanswersviews
将结构作为其第一个成员的别名是否是严格的别名违规?
示例代码: struct S { int x; }; int func() { S s{2}; return (int &)s; // Equivalent to *reinterpret_cast<int *>(&s) } 我认为这很常见,被认为是可以接受的 . 该标准确保结构中没有初始填充 . 但是,这种情况未在严格别名规则(C17 [... -
23 votesanswersviews
何时char *对于严格的指针别名是安全的?
我一直在尝试理解严格的别名规则,因为它们适用于char指针 . Here这是陈述: 始终假定char *可以引用任何对象的别名 . 好的,在套接字代码的上下文中,我可以这样做: struct SocketMsg { int a; int b; }; int main(int argc, char** argv) { // Some code... SocketMsg ... -
2 votesanswersviews
使用其他类型移动一种类型的值是否会违反严格的别名?
是否违反严格的别名规则,使用uint32_t移动任何类型的项目,然后再读回来?如果是这样,它是否也违反严格的别名规则,从uint32_ts数组到任何类型的数组的memcpy,然后读回元素? 以下代码示例演示了这两种情况: #include <assert.h> #include <stdio.h> #include <stdint.h> #include <... -
8 votesanswersviews
编写符合严格别名的memcpy符合条件
在询问“如何实现符合严格别名规则的memcpy函数”时,一般的答案就是这样的 void *memcpy(void *dest, const void *src, size_t n) { for (size_t i = 0; i < n; i++) ((char*)dest)[i] = ((const char*)src)[i]; return dest; } ... -
22 votesanswersviews
memset编写的对象的有效类型是什么?
代码1: unsigned int *p = malloc(sizeof *p); memset(p, 0x55, sizeof *p); unsigned int u = *p; 代码2: void *d = malloc(50); *(double *)d = 1.23; memset(d, 0x55, 50); unsigned int u = *(unsigned int *)d; ... -
6 votesanswersviews
任何编译器都通过memcpy / memmove传输有效类型
根据N1570 6.5 / 6: 如果使用memcpy或memmove将值复制到没有声明类型的对象中,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型为复制值的对象的有效类型(如果有) . 这表明即使在“long”和其他整数类型具有相同表示的系统上,以下内容也会调用Undefined Behavior: #if ~0UL == ~0U #defin... -
33 votesanswersviews
gcc,严格别名,并通过联合进行转换
你有任何恐怖故事要讲吗? GCC手册最近添加了一个关于-fstrict-aliasing的警告并通过联合转换指针: [...]获取地址,强制生成指针并取消引用结果具有未定义的行为[强调添加],即使转换使用了联合类型,例如: union a_union { int i; double d; }; int f() { double ... -
1 votesanswersviews
可以在这个实例中转换指向成员变量的指针吗?
我最近一直在刷新/更新我的C知识,学习严格的别名使我有点担心将一种类型的指针转换成另一种类型 . 我知道以下代码示例在我的编译器上实际工作,但我想确保它符合当前标准: #include <iostream> using namespace std; class MyBase { public: virtual void DoSomething() = 0; };...