`
cloudtech
  • 浏览: 4594893 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

warning: dereferencing type-punned pointer will break strict-aliasing rules(转)

 
阅读更多

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*)可能才是需要去思考的问题了。

分享到:
评论

相关推荐

    warning: dereferencing type-punned pointer will break strict-aliasing rules

    原因是 gcc 3 引入了 strict aliasing 架构,当编译时使用了 -fstrict-aliasing 参数(该参数在使用了 -O2 , -O3, -Os 优化参数的情况下默认生效),而源代码中存在一些违反了 strict-aliasing 规则的地方的话,...

    ecdsa.zip_ECDSA_ecdsa C语言

    ecdsa修改后源码,直接调用接口即可用,编程语言为C语言。

    pcf8574:pcf8574 I2C IO扩展器芯片的库

    PCF8574 这是用于 I2C IO扩展器芯片的Python库。 它将8位IO端口抽象为Python列表,并允许一次读取/写入单个引脚或整个端口。 安装 该库取决于smbus-cffi软件包。 如果您使用的是基于Debian的系统,则可能需要apt-...

    hide-data-in-ptr:如何在指针中隐藏数据

    在ptr中隐藏数据 ####博文#### 在指针中隐藏数据 ( ) ####跑步#### gcc data_in_ptr.c -o data_in_ptr && ./data_in_ptr Original ptr: 3216722220 ...Dereferencing cleansed ptr: 701

    PLX PCI卡 linux驱动

    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 ...

    Groovy in Action 2nd Edition-Manning(2016)

    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...

    Addison.Wesley.C++.by.Dissection.2002.pdf

    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 ....

    Apress.PHP.7.Solutions.4th.Edition.rar

    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 和 Bash 脚本 .................................................................................................2 1.1.普通 shell 程序............................................................

Global site tag (gtag.js) - Google Analytics