提领类型双关的指针将破坏重叠规则——strict-aliasing

2023-10-26

转载请保留本行原始出处声明信息 : http://www.zeali.net/entry/454 MaDe1nZEAL

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提领类型双关的指针将破坏重叠规则——strict-aliasing 的相关文章

随机推荐

  • 跨域 nginx反向代理proxy未添加pathRewrite导致的404问题

    跨域 nginx反向代理proxy未添加pathRewrite导致的404问题 pathRewrite是使用proxy进行代理时 对请求路径进行重定向以匹配到正确的请求地址 未添加pathWrite时 proxy csdn target h
  • ecshop 404设置方法

    ecshop是一款非常好的B2C开源程序 但SEO方面做的不足的地方不少 比如404 TITLE方面 今天分享下ecshop404设置方法 默认的ECSHOP也做了这方面的设置 它的设置是这样的 当某个商品或者商品类别不存在的时候 自动跳转
  • Java 知识点整理-14.File类

    应用Alt 对变量调用方法进行快速打印 选中要打印的内容 按Alt 选最后一个选项 方法介绍中 未明确指明对文件或目录进行操作 则两者皆可 目录 File类的概述 File类的构造方法 File类的创建功能 File类的重命名和删除功能 F
  • ssh服务及其免密配置

    ssh服务 1 ssh是什么 掌握原理 ssh gt secure shell 安全的shell 用来远程管理服务器 网络上传输的内容时进行了加密 ssh 是一个应用层的协议 openssh 是一个软件 底层使用ssh协议来远程管理服务器
  • php 实时显示日志 web,[PHP] php作为websocket的客户端实时读取推送日志文件

    首先要使用composer来下载一个第三方扩展就可以实现php的websocket客户端 直接在当前目录生成下composer json文件就可以了 composer require textalk websocket require ve
  • 无需额外数据,首次实现ImageNet 87.1% 精度,颜水成团队开源VOLO

    人工智能学习离不开实践的验证 推荐大家可以多在FlyAI AI竞赛服务平台多参加训练和竞赛 以此来提升自己的能力 FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台 每周免费提供项目开源算法样例 支持算法能力变现以及快
  • 基于时间的一次密码TOTP

    相关算法 HOTP HMAC based One Time Password 基于HMAC的一次性口令 TOTP Time Based One Time Password 基于时间的一次性口令 HMAC Hash based message
  • 欧科云链OKLink:目前已限时开放OnchainAML API免费试用权限

    据OKLink官推消息 目前OKLink已面向全球用户 除中国大陆地区以外 开放KYT和KYA的Onchain API试用服务 用户可在申请成功后 基于默认版的Risk Setting生成交易风险检测的警报信息 据悉 OKLink Onch
  • npm 和 yarn 命令对照表

    以typescript为例子 初始化项目 npm init yarn init 根据package json安装 npm install yarn 安装具体的包 npm install typescript yarn add typescr
  • Java课题笔记~ ServletConfig

    概念 代表整个web应用 可以和程序的容器 服务器 来通信
  • 2023自动化测试的10个最佳实践(建议收藏)

    虽然大家都知道坚果是非常健康和有营养的 但是 当你尝试吃它的时候 我猜测过程都不会很顺利 现实就是那么相似 我们都知道测试自动化对软件开发有好处 就像坚果对我们的身体一样 很遗憾很多公司在不考虑细微差别的情况下就赶着上线测试自动化 如果您不
  • 中国剩余定理(孙子定理)

    看了很多博客始终没弄明白中国剩余定理到底是怎么算出来的 看孙子的话完全是一脸懵逼啊 还好有这个博客大神的博客Orz 真的讲的特别清晰 点赞点赞 下面会用到的数学公式 如果a b c 那么如果x b c 2 此时x a 2 也就是说除数相等时
  • keil警告 LED.C(38): warning C276: constant in condition expression

    出现此警告一般是由于把if a 3 写成了if a 3 即少写了一个 号 不能作为判断条件
  • 音频处理——详解PCM数据格式

    目录 知识储备 什么是PCM 采样 采样率 重采样 量化 编码 PCM常用指标 PCM数据流 知识储备 音频处理 音频编码原理简介 音频处理 音频处理的基本概念 什么是PCM PCM全称Pulse Code Modulation 翻译一下是
  • yolov5剪枝开源分享

    剪枝分软剪枝和硬剪枝 软剪枝的概念来源于Soft Filter Pruning SFP 这篇论文 下图阐述了软剪枝 SFP 和硬剪枝 Hard Filter Pruning HFP 的区别 它们的不同点是HFP在每个epoch后会将卷积核直
  • 小米路由器R4A(千兆版)固件刷opewrt、刷官方固件

    文章目录 前言 一 刷openwrt 1 获取root权限 2 刷入breed 3 刷入openwtr固件 二 恢复官方固件 1 进入breed界面 2 设置电脑IP 3 固件恢复 三 拯救砖机 总结 前言 最近新买一台小米路由器 老的那台
  • 关于单例模式的一个坑

    问题 有一种情景 单例实例化对象需要在网络通信的通道建立好之后 如果使用饿汉模式 程序开始执行 上来先实例化一个 也不管后面用不用得到 饿汉模式 ifndef SINGLETON define SINGLETON class Singlet
  • python mesa包教程

    python中的mesa包预制了一些类 提供了一些基础模型 可以大大简化abm建模的工作量 在python中实现 也有利于和其它算法相结合 本文是一次作业 按照个人理解把mesa包教程整理 代码压缩成了两大部分 如果是新手上手 建议查看下方
  • 基于js的炫酷动画的代码

  • 提领类型双关的指针将破坏重叠规则——strict-aliasing

    转载请保留本行原始出处声明信息 http www zeali net entry 454 MaDe1nZEAL warning dereferencing type punned pointer will break strict alia