C语言中的Strict Aliasing Rule
文章目录
- 前言
- 没有警告不代表没有问题
- 目前的应对方法
前言
很久没写了,水一篇。
最近有个代码在gcc 4.8.5上编译失败。编译失败的提示是:
error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
查了下这个报错,有点复杂。大体是不要使用一个类型的指针,去操作另一种指针指向的空间。比如下面这样:
#include <inttypes.h>
#include <stdio.h>struct internet {__uint16_t ip;
};__uint8_t address[10];int main(int argc, char *argv[]) {address[0] = 1;address[1] = 2;struct internet *net = (struct internet *)address;__uint16_t ip = net->ip;printf("%" PRIu8 "\n", address[0]);printf("%" PRIu8 "\n", address[1]);printf("%" PRIu16 "\n", ip);
}
然而,上面这段代码在不同的gcc 11.4.1版本下编译,没有问题。
关于Strict Aliasing Rule的详细解释见:What is the Strict Aliasing Rule and Why do we care?、c when would you not want to use strict aliasing?
我也没有完全搞懂。下面示例,来自这个链接。
没有警告不代表没有问题
下面我们来看下这个示例。在常见的gcc版本下编译,都能复现。
#include <iostream>int foo(float *f, int *i) {*i = 1;*f = 0.f;return *i;
}int main() {int x = 0;std::cout << x << std::endl; // Expect 0int x_ret = foo(reinterpret_cast<float *>(&x), &x);std::cout << x_ret << "\n"; // Expect 0?std::cout << x << std::endl; // Expect 0?
}
首先,我们编译的时候不要开启优化,输出如下:
g++ -O0 demo-2.cpp -o demo-20
0
0
接着,我们编译的时候开启优化,输出如下:
g++ -O2 demo-2.cpp -o demo-20
1
0
这就比较脑壳痛了。日常开发编译的是debug版本,它没有优化。发布的时候,编译的是release版本,它有一定的编译优化。然后相同的代码,debug和release版本的运行不同。这个问题可能就很难排查。
为什么会出现这种情况?编译器也没有给出警告?
大概是因为优化的时候,编译器看到要返回的是i,和f又没有什么关系,给返回寄存器里面提前填入了i的值。
目前的应对方法
一般来说,日常编程中,即使不同类型的指针,操作相同的内存,也不会出现上面这种情况。所以正常使用就好,不用特地回避,出问题再解决问题。(为什么不事先回避这个问题呢?因为搞不清,那就先不管。)
如果遇到上面这种问题,或者因为这个问题编译失败,怎么办呢?
- 第一种方法是:使用memcpy进行拷贝,不要直接使用不同类型的指针,操作相同的内存。
- 第二种方法是:在gcc的构建选项中添加
-fno-strict-aliasing选项。但是这会导致整个构建过程都忽略了这个限制。 - 第三种是,可以尝试下使用
__attribute__((optimize("-fno-strict-aliasing")))修饰函数,但是这不一定有效。
相关文章:
C语言中的Strict Aliasing Rule
文章目录 前言没有警告不代表没有问题目前的应对方法 前言 很久没写了,水一篇。 最近有个代码在gcc 4.8.5上编译失败。编译失败的提示是: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werrorstrict-aliasing]查了下…...
单字符检测模型charnet使用方法,极简
Git链接 安装按照上面的说明,说下使用。 把tools下面的test做了一点修改,可以读取一张图片,把里面的单个字符都检测和识别出来。 然后绘制到屏幕上。 import torch from charnet.modeling.model import CharNet import cv2, os import num…...
Erlang、RabbitMQ下载与安装教程(windows超详细)
目录 安装Erlang 1.首先安装RabbitMQ需要安装Erlang环境 2.点击下载好的.exe文件进行傻瓜式安装,一直next即可 3.配置Erlang环境变量 安装RabbitMQ 1.给出RabbitMQ官网下载址:Installing on Windows — RabbitMQ,找到 2.配置RabbitMQ环境变量࿰…...
2023年终总结丨很苦,很酷!
文章目录 个人简介丨了解博主写在前面丨博主介绍年终总结丨博主成就年终总结丨博主想说年终总结丨学习芝士年终总结丨未来展望写在后面丨新年快乐 个人简介丨了解博主 主页地址:https://blog.csdn.net/m0_68111267 荣誉身份 ⭐2022年度CSDN 社区之星 Top6 ⭐2023年…...
鸿蒙 DevEco Studio 3.1 入门指南
本文主要记录开发者入门,从软件安装到项目运行,以及后续的学习 1,配置开发环境 1.1 下载安装包 官网下载链接 点击立即下载找到对应版版本 下载完成,按照提示默认安装即可 1.2 下载SDK及工具链 运行已安装的DevEco Studio&…...
ubuntu多用户环境dockerbug,卸载重装docker流程
之前不小心误操作删除重装docker,结果删除没成功,更没法重装,每次apt install都会报一个docker错误,虽然不影响软件的常规安装~但是现在还是需要装一个完整docker,还是选择删除一下,重点是关闭服…...
微信小程序开发系列-09自定义组件样式特性
微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…...
数据结构 模拟实现LinkedList单向不循环链表
目录 一、链表的简单介绍 二、链表的接口 三、链表的方法实现 (1)display方法 (2)size得到单链表的长度方法 (3)addFirst头插方法 (4)addLast尾插方法 (5…...
2023-12-24 LeetCode每日一题(收集足够苹果的最小花园周长)
2023-12-24每日一题 一、题目编号 1954. 收集足够苹果的最小花园周长二、题目链接 点击跳转到题目位置 三、题目描述 给你一个用无限二维网格表示的花园,每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐…...
Oracle 19c OCP 1z0 082考场真题解析第17题
考试科目:1Z0-082 考试题量:90 通过分数:60% 考试时间:150min 本文为云贝教育郭一军guoyJoe原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 17. Which three …...
掌握这十几个Python库才是爬虫界的天花板,没有你搞不定的网站!实战案例:Python全网最强电影搜索工具,自动生成播放链接
掌握这十几个Python库才是爬虫界的天花板,没有你搞不定的网站!实战案例:Python全网最强电影搜索工具,自动生成播放链接。 用来爬虫的十几个Python库。只要正确选择适合自己的Python库才能真正提高爬虫效率,到达高效爬虫目的。 1.PyQuery from pyquery import PyQuery as …...
模型 KANO卡诺模型
本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。需求分析。 1 卡诺模型的应用 1.1 餐厅需求分析故事 假设你经营一家餐厅,你想了解客户对你的服务质量的满意度。你可以使用卡诺模型来收集客户的反馈,并分析客户的…...
启明智显开源项目分享|基于Model 3c芯片的86中控面板ZX3D95CM20S-V11项目软硬件全开源
前言: 本文为4寸 480*480 RGB接口IPS全面触屏的86中控面板(RT-ThreadLVGL)软硬件开源干货内容,该项目是综合性非常强的RTOS系列项目!项目主控芯片使用 Model 3c,整体实现了简化版本的86中控面板的功能需求…...
Kind创建k8s - JAVA操作控制
kind 简介kind 架构安装 Kind (必备工具)docker官网kubectl官网kind官网校验安装结果 关于kind 命令 安装一个集群查看当前 Kubernetes 集群中的节点信息。查看当前命名空间下中的Pod(容器实例)的信息。使用 kind create cluster 安装,关于安…...
Qt sender()函数
sender函数原型: QObject *sender() const; 如果在由信号激活的插槽中调用该函数,返回指向发送信号的对象的指针,否则返回0,该指针仅在从该对象的线程上下文调用此函数的槽执行期间有效。 主要代码如下: 其中运用了Q…...
Java开发框架和中间件面试题(6)
目录 61.什么是Spring Batch? 62.请举例解释Required与Qualifier注解? 61.什么是Spring Batch? Spring batch是一个轻量级的,完善的批处理框架,他主要的目的在于帮助企业建立健壮,高效的批处理应用。Spri…...
附录E SQL入门之SQL保留字
本专栏目录 第1课 SQL入门之了解SQL 第2课 SQL入门之检索数据 第3课 SQL入门之排序检索数据 第4课 SQL入门之过滤数据 第5课 SQL入门之高级数据过滤 第6课 SQL入门之用通配符进行过滤 第7课 SQL入门之创建计算字段 第8课 SQL入门之使用数据处理函数 第9课 SQL入门之汇总数据 第…...
thinkphp6.0升级到8.0
目录 一:升级过程 二:报错处理 最近写的项目需要使用thinkphp8.0,之前的老项目需要从php6.0升级到8.0,特此记录下升级过程。 一:升级过程 查看版本: php think version,我目前的版本是6.1.4 生成thin…...
机器学习(一) -- 概述
系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理 未完待续…… 目录 系列文章目录 前言 一、机器学习定义(是什么) 二、机器学习的应用(能做什么) 三、***机器…...
SpringBoot定时监听RocketMQ的NameServer
问题分析 自己在测试环境部署了RocketMQ,发现namesrv很容易挂掉,于是就想着监控,挂了就发邮件通知。查看了rocketmq-dashboard项目,发现只能监控Broker,遂放弃这一路径。于是就从报错的日志入手,发现最终可…...
Phi-3-mini-128k-instruct辅助Dev-C++初学者:C/C++编译错误智能解读
Phi-3-mini-128k-instruct:你的Dev-C编程“陪练” 刚学C/C那会儿,你是不是也经常被Dev-C弹出的那一大串编译错误信息搞得一头雾水?什么“undefined reference”,什么“expected ‘;’ before ‘}’ token”,每个单词都…...
农机经销商必看:如何用2000-2020年县级数据精准定位区域市场?
农机经销商区域市场精准定位实战指南:基于2000-2020年县级数据分析 站在山东潍坊的田间地头,老张望着远处几台正在作业的拖拉机陷入了沉思。作为一家中型农机经销商的区域经理,他每年最头疼的就是如何准确预测各县区的农机需求——备货多了占…...
次元画室+AI绘图工作流:从文字描述到精准提示词的无缝衔接
次元画室AI绘图工作流:从文字描述到精准提示词的无缝衔接 1. 为什么需要AI绘图工作流? 在动漫角色设计领域,创作者们长期面临一个核心矛盾:脑海中有丰富的创意,却难以准确转化为视觉形象。传统工作流程中,…...
SecGPT-14B部署教程:模型热更新机制设计,不中断服务切换安全知识版本
SecGPT-14B部署教程:模型热更新机制设计,不中断服务切换安全知识版本 1. SecGPT-14B简介 SecGPT是由云起无垠推出的开源大语言模型,专门针对网络安全领域设计。这个模型融合了自然语言理解、代码生成和安全知识推理等核心能力,能…...
OpenClaw性能优化:降低GLM-4.7-Flash任务Token消耗的5个技巧
OpenClaw性能优化:降低GLM-4.7-Flash任务Token消耗的5个技巧 1. 为什么需要关注Token消耗 当我第一次在本地部署OpenClaw并接入GLM-4.7-Flash模型时,最让我震惊的不是它的自动化能力,而是执行简单任务后查看账单时的Token消耗数字。一个看似…...
EdB Prepare Carefully:定制你的RimWorld完美开局体验
EdB Prepare Carefully:定制你的RimWorld完美开局体验 【免费下载链接】EdBPrepareCarefully EdB Prepare Carefully, a RimWorld mod 项目地址: https://gitcode.com/gh_mirrors/ed/EdBPrepareCarefully 是否厌倦了RimWorld随机生成的殖民者团队带来的不确定…...
别再折腾虚拟机了!用Docker 5分钟搞定Oracle 10g测试环境(附阿里云镜像源)
5分钟极速部署Oracle 10g:Docker化开发环境实战指南 每次需要搭建Oracle测试环境时,你是否也经历过这样的痛苦?下载几个GB的安装包、配置复杂的系统参数、等待漫长的安装过程,最后可能还会遇到各种依赖问题。作为一名长期与Oracle…...
三步解锁QQ空间历史说说备份:数据留存与管理实用指南
三步解锁QQ空间历史说说备份:数据留存与管理实用指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory QQ空间数据备份是许多用户保存青春记忆和重要记录的需求。GetQzonehist…...
Umi-OCR插件技术方案:5款引擎深度对比与实战配置指南
Umi-OCR插件技术方案:5款引擎深度对比与实战配置指南 【免费下载链接】Umi-OCR_plugins Umi-OCR 插件库 项目地址: https://gitcode.com/gh_mirrors/um/Umi-OCR_plugins Umi-OCR插件库为开源OCR工具提供了丰富的引擎选择,从本地CPU加速到云端AI识…...
BlueROV2进阶:巧用ArduSub参数配置实现多舵机协同控制
1. 从单舵机到多舵机协同的跨越 第一次用Pixhawk控制单个舵机转动时的兴奋感还记忆犹新,但当真正开始构建BlueROV2这样的水下机器人时,你会发现单一舵机控制远远不够。想象一下这样的场景:机械爪需要精准开合,云台要平稳转动&…...
