warning: dereferencing type-punned pointer will break strict-aliasing rules(转)
来源:互联网 发布:excel中国数据地图 编辑:程序博客网 时间:2024/06/05 11:59
摘自: http://blog.csdn.net/gmstart/article/details/6600043
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编译C语言的时候加了一个-Os的选项,于是乎就出现了这个警告,删了之后就没有警告了,学习中~~~
- warning: dereferencing type-punned pointer will break strict-aliasing rules
- warning: dereferencing type-punned pointer will break strict-aliasing rules
- warning: dereferencing type-punned pointer will break strict-aliasing rules
- warning:dereferencing type-punned pointer will break strict-aliasing rules
- warning: dereferencing type-punned pointer will break strict-aliasing rules(转)
- warning: dereferencing type-punned pointer will break strict-aliasing rules(转)
- warning: dereferencing type-punned pointer will break strict-aliasing rules(转)
- warning: dereferencing type-punned pointer will break strict-aliasing rules(转)
- memcached 1.4.15 make error: dereferencing type-punned pointer will break strict-aliasing rules 解决方法
- memcached-1.4.5安装时候出现错误error: dereferencing type-punned pointer will break strict-aliasing
- warning: dereferencing pointer ** does break strict-aliasing rules
- does break strict-aliasing rules
- dereferencing pointer to incomplete type
- dereferencing pointer to incomplete type"
- dereferencing pointer to incomplete type
- dereferencing pointer to incomplete type
- dereferencing pointer to incomplete type
- dereferencing pointer to incomplete type
- widget实现forceStop后可以使用的思路
- 黑马程序员 java继承的学习总结
- ORACLE分区表的概念及操作
- 放下了.net ,走上了java
- 代码优化
- warning: dereferencing type-punned pointer will break strict-aliasing rules(转)
- 关于数字转换成人民币大写的问题
- 辗转相除法求最大公约数
- SHELL 中的括号
- linux下串口调试工具_xgcom
- python 中使用ftpmirror的例子
- #define const为什么不能用定义的量做位宽跟定义数组长度?
- C++报错集合:在Linkeage时出现undefined reference to `SPTraderController::writeAplLog(bfl::BString const&)'
- 新浪微博布局学习——妙用TabHost