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
优化参数的情况下默认生效),而源代码中存在一些违反了 strict-aliasing 规则的地方的话,编译器就会对这部分代码提出 warning 。
gcc 3 manual 对于 -fstrict-aliasing
参数的说明是:Allows
the compiler to assume the strictest aliasing rules applicable to the
language being compiled. For C (and C++), this activates optimizations
based on the type of expressions. In particular, an object of one type
is assumed never to reside at the same address as an object of a
different type, unless the types are almost the same. For example, an
"unsigned int" can alias an "int", but not a "void*" or a "double". A
character type may alias any other type.
简而言之, 在该参数激活的情况下,编译器希望不同类型的对象不会指向同一个地址。比如像这段代码:
int
retLen;
someSetFunc((unsigned long
*)&retLen);
printf
("ret len = %d/n"
,retLen);
由于 someSetFunc 的传入参数类型定义为 unsigned long
,所以需要进行这样的指针类型强制 cast 。但对于 -fstrict-aliasing
优化参数来说,这样的转换是有潜在问题的(但实际上可能并不会造成任何问题)。所以如果现有的源代码存在太多这样的类型强制转换的问题的话,对这些代码进行修改也许会是场噩梦。最简单的方法是使用 -fno-strict-aliasing
参数来关闭 gcc 的优化选项,代价是放弃了 strict-aliasing
编译优化可能带来的可执行代码的性能提升。当然也可以用 -Wno-strict-aliasing
来屏蔽相关的 warning 信息,但无论这些 warning 信息多么的无关紧要,总还是“疑似危险”,所以可能的话最好还是把所有的 warning 都消灭掉。
消灭的方法也不算复杂,正如 gcc manual 所示的那样,可以是采用 union 的不同成员变量来完成类型的转换。上面那段代码可以改为:
union
u_retLen
{
int
retLen;
unsigned long
ptr;
};
someSetFunc(&u_retLen.ptr);
printf
("ret len = %d/n"
,u_retLen.retLen);
虽然会使源代码变得丑陋,但对于大部分已有的源代码来说,这可能是改动最小的方案了。而对于新写的代码来说,如何更好的设计函数的入口参数(比如使用 void*)可能才是需要去思考的问题了。
分享到:
相关推荐
原因是 gcc 3 引入了 strict aliasing 架构,当编译时使用了 -fstrict-aliasing 参数(该参数在使用了 -O2 , -O3, -Os 优化参数的情况下默认生效),而源代码中存在一些违反了 strict-aliasing 规则的地方的话,...
ecdsa修改后源码,直接调用接口即可用,编程语言为C语言。
PCF8574 这是用于 I2C IO扩展器芯片的Python库。 它将8位IO端口抽象为Python列表,并允许一次读取/写入单个引脚或整个端口。 安装 该库取决于smbus-cffi软件包。 如果您使用的是基于Debian的系统,则可能需要apt-...
在ptr中隐藏数据 ####博文#### 在指针中隐藏数据 ( ) ####跑步#### gcc data_in_ptr.c -o data_in_ptr && ./data_in_ptr Original ptr: 3216722220 ...Dereferencing cleansed ptr: 701
application can then directly access the space via simple memory dereferencing, bypassing the PLX API/driver & resulting in greater performance, especially for small transfers. The application is ...
simplified property access, null-safe dereferencing, closures, and more. Surprisingly many languages have adopted Groovy’s optional typing strategy—few languages can claim to have static and dynamic...
2.8.7 The break and continue Statements... . 58 2.8.8 The switch Statement...... 59 2.8.9 The goto Statement...... . . 62 2.9 Software Engineering: Debugging..... . 62 2.10 Dr. P’s Prescriptions........
Contents Preface i 1 Introduction 1 1.1 Information isBits inContext . . . . . . ....1.2 Programs areTranslated byOtherPrograms intoDifferent Forms ....1.3 ItPays toUnderstandHowCompilation SystemsWork ....
using array shorthand syntax for list(), array dereferencing, and array unpacking with the splat operator. The problem is, you're not a programmer and the thought of writing code sends a chill up ...
第一章 Bash 和 Bash 脚本 .................................................................................................2 1.1.普通 shell 程序............................................................