虽然很怪异,但 target 是unsigned char 类型,满足 Strict aliasing rules,编译器就做出了这样的假设。 解决方法有 3,其 1 是将 this->target 缓存在本地变量中,就像那行注释一样;其 2 是修改 target 变量类型为 uint16_t,并修改相关代码;其 3 是使用 restrict 关键字(Only in C,在 C++中,并无明确统一...
“dereferencing type-punned pointer will break strict-aliasing rules”错误通常发生在当你尝试通过一种类型的指针去访问另一种类型对象所占据的内存时。这种类型的不匹配会导致编译器无法确保内存访问的正确性,从而可能产生未定义行为。 例如,如果你有一个char类型的数组,并尝试通过将其转换为int类型的指针来存储一个...
unionX{int m;short s;};intmain(){Xx;x.m=0x12345678;short s=x.s;printf("%x\n",s);return0;} 然而,下列用法仍然是不安全的(多版本gcc实测正常,也未有“dereferencing type-punned pointer will break strict-aliasing rules”编译告警,但gcc手册指出结果可能不符合预期): 代码语言:javascript 复制 #in...
前两年还只是警告下。这两年,你代码如果不跟 linux 内核一样加上-fno-strict-aliasing的话,基本就等...
然而,下列用法仍然是不安全的(多版本gcc实测正常,也未有“dereferencing type-punned pointer will break strict-aliasing rules”编译告警,但gcc手册指出结果可能不符合预期):#include <stdio.h> union X { int m; short s; }; int main() { X x; x.m = 0x12345678; short* s = &x.s; printf("%x...
在高优化级别下,不同类型指针之间的强制类型转换可能会触发以下警告: warning: dereferencing type-punned pointer will break strict-aliasing rules A: 在高优化级别下,gcc假定不同类型指针不会指向同一片内存,以加强优化,从而可能导致编译出不符合原意的代码。 使用-fno-strict-aliasing,关闭在此类代码上的优化。
施加最强的别名规则(aliasing rules)。 标准Standard -ansi 支持符合ANSI标准的C程序。这样就会关闭GNU C中某些不兼容ANSI C的特性。 -std=c89 指明使用标准 ISO C90 作为标准来编译程序。 -std=c99指明使用标准 ISO C99 作为标准来编译程序。 -std=c++98指明使用标准 C++98 作为标准来编译程序。
warning: dereferencing type-punned pointer will break strict-aliasing rules 在gcc 2.x 下编译没有任何 warning 信息的代码换到 gcc 3.x 版本下之后出现了类似的 warning 。原因是 gcc 3 引入了 strict aliasing 架构,当编译时使用了 -fstrict-aliasing 参数(该参数在使用了 -O2 , -O3, -Os 优化参数的...
warning: dereferencing type-punned pointer will break strict-aliasing rules 在gcc 2.x 下编译没有任何 warning 信息的代码换到 gcc 3.x 版本下之后出现了类似的 warning 。原因是 gcc 3 引入了 strict aliasing 架构,当编译时使用了-fstrict-aliasing参数(该参数在使用了-O2 , -O3, -Os优化参数的情况下...
[2]GCC 4 编译警告:warning: dereferencing type-punned pointer will break strict-aliasing rules 有...