进入编译器后,一个函数经历了什么?

来源 | 编程技术宇宙

责编 | Carol

封图 | CSDN 付费下载自视觉中国

我是一个函数

我是一个函数,名叫str_upper,我可以把输入的字符串从小写变成大写。不信你看,我长这样:

char* str_upper(char* str, int len) {char upper[256];if (len >= 256 || len <= 0) return nullptr;for (int i = 0; i < len; i++) {if (str[i] >= 'a' && str[i] <= 'z') {upper[i] = str[i] - 32;} else {upper[i] = str[i];}}return upper;
}

上面是我的源代码形式,听我的好朋友str_lower说,一会儿我们就要一起被送到一个叫编译器的地方加工处理了,我心里害怕极了。

编译器之旅

没多久,我们就来到了这里,一座很庞大到高楼,里面有好多精密的机器在不停的运转着。

一进入大厅,好多函数代码在这里排队等待。

我抬头向上望去,不知道有多少层楼,每一层都有一个指示牌,从下往上分别写着:

  • 预处理

  • 词法分析

  • 语法分析

  • 语义分析

  • ···

再往上太远就看不太清楚了。

所有的函数代码按照文件为单位排好队,静静地等待着。

不过没有等太久,就轮到了我们这一队。

来了一个工作人员把我们带到了一个房间,让我们都好好躺着,一台机器快速的从头到尾扫描了一遍,将我们所在文件中出现的#include#define全部给替换掉了。

接着,通过房间里的电梯,将我们送上了二楼。

接下来的一段时间,我们在好几层楼都做了“体检”,每个函数都被那些像CT一样的机器照了个遍。

不一会儿,来到了编译层,这一层有一个特别奇怪的机器,我看到一个个函数被送了进去,出来的时候都变了样子。不仅如此,接待处的工作人员看起来很凶,我这下更加紧张了。

函数调用约定

工作人员拿到了我的资料,瞅了几眼,问到:“请问你的调用约定是什么?”

我有些懵,不太懂他的意思,小声问到:“不好意思,你刚问什么?”

工作人员有点不耐烦了,提高了音量,“我是问你调用约定是什么?调用约定啊!”

看见我仍然一脸茫然,工作人员直接给我的资料上调用约定那一栏盖上了一个标记:cdecl

我有点摸不着头脑,同行的小伙伴str_lower拽了我一下说到:“他是在问你函数的调用约定,就是约定调用函数的方式,涉及怎么传递参数,谁来恢复调用栈等”

他这一说我才反映过来,“这个调用约定都有哪些可选的呢?”

“一般有三种:”

  • cdcel,参数从右往左入栈,主调函数负责恢复栈平衡

  • stdcall,参数从右往左入栈,被调函数负责恢复栈平衡

  • fastcall,参数通过寄存器传递,寄存器不够再用栈传递

“他刚才看你没有显式声明,就默认给你cdecl的方式了”,小伙伴继续说到。

我点了点头,原来调用个函数还有这么多讲究呐!

Stack Canary

“别闲聊了,快进去吧!”,工作人员催我了。

我准备走向那台可怕的机器。

“唉,等一下”,正紧张着,工作人员又叫住了我。

我回头看去,工作人员正招手让我过去。

“你好,是我的代码有什么问题吗?”,我紧张的问到,生怕有错误被打回去,连累我们整个文件都要被遣返。

“不是,是我注意到你的函数里有一个局部数组,需要给你加一下栈溢出保护”,工作人员说到。

我看了下我的代码,确实有一个局部字符数组:

char upper[256];

“栈溢出保护是什么啊?”,我小声问到。

工作人员没有搭理我,忙着给我的资料上加东西。

旁边的小伙伴又把我拽了过去,说到:“咱们函数里面定义的局部变量、参数是存放在线程栈里面的。线程要不断游走在不同的函数中,调用函数后为了能回到原来的地方,调用之前把返回地址也放在了线程栈里。就像这样,你看会不会有什么问题:”

我仔细看了下,“哦,要是越界访问我的upper数组,那就可以修改返回地址,那可就危险了!”

“很聪明嘛!”

“那这个怎么加保护呢?”,我问到。

“你看,函数进来之前,先在局部变量和返回地址之间设置一个数值,函数返回之前再去检查一下,如果栈里的数据被破坏了,检查这个数值就能发现,提前抛出异常!”,小伙伴耐心的解释到。

“这样啊,那岂不是要把我打回去加上你说的这些设置和检查代码?”,我继续提问。

这时,工作人员听到了我们的闲聊,“不用,我们编译器自动添加好了,快去吧,已经处理好了”

我瞥了一眼,看到我的资料上增加了一个叫Stack Canary的标记。

我小心翼翼的走进了那架奇怪的机器,立刻就失去了知觉,等我醒来时,我的身体已经发生了变化,变成了一堆奇怪的代码,现在我长这样了:

链接

没过一会儿,我们这一队的所有函数代码都编译完成,大家从原来的.c文件都搬到了新家:一个.o文件,我也再次见到了小伙伴str_lower。

“咱们是不是已经完成了编译,可以离开这里了吧?”

“还不行,编译虽然是完成了,还差链接这一步呢!”

又过了一小会儿,和我们一起过来的其他文件的函数代码也编译完成了,咱们一堆.o文件一起被送到了编译器大厦的顶楼:链接层。

这一层也有一个巨大的机器,机器背后连接了一个管道,不知通向了哪里。

我们这一批的所有.o文件挨个走进了这个巨大的机器,像是一条时空隧道一般,穿行于其间,我感觉到了巨大的压力把我们挤压在了一起,很快我们再一次失去了意识。

醒来之后,我发现所有的函数们都被合在了一个文件中,这是一个可执行文件,而我的身体也再次发生了变化,变成了一段段的二进制指令,现在我长这样了:

终于离开了编译器,真是一趟难忘的旅程,不过我再也不想来了······

彩蛋

没想到命运跟我开了一个玩笑,我的第一次运行就出了错!

我又要被打回去重新改造,再走一遍这魔鬼般的旅程。

你能帮我看看,我的代码哪里有错吗?

更多阅读推荐

  • 闲鱼的云原生故事:靠什么支撑起万亿的交易规模?

  • 野鸡大学怎么知道考生电话的?

  • 达摩院NLP团队斩获六项世界冠军背后,让AI没有难懂的语言

  • 我把这篇文章给女朋友看,她终于明白什么是「数据中台」了

  • 云交易所已成资金盘、杀猪盘重灾区,曾被寄予厚望,如今罪恶丛生

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker sonarqube 7.7 sonar-scanner-4.6.2 maven 安装、搭建+实战

文章目录一、docker安装Mysql1. 映射目录2. 赋予权限3. 镜像拉取4. 运行容器5. 查看日志6. 创建数据库二、docker安装sonarqube2.1. 映射目录2.2.赋予权限2.3. 镜像拉取2.4. 运行容器2.5. 查看日志二、中文简体2.1. 版本对照2.2. download2.3. 重启容器三、规则添加3.1. 规则无…

使用CLONE TABLE方式实现同region不同可用区的MaxCompute

该文章主要针对于用户同region不同账户之间的MaxCompute数据迁移方式&#xff0c;属于迁移的方式可以有三种方式&#xff0c;一、添加MaxCompute数据源的方式进行数据迁移&#xff08;该方式针对多个表配置同步节点较为繁琐&#xff09;&#xff1b;二、使用tunnel方式结合代码…

Fabric中的Transient Data与Private Data

在Hyperledger Fabric中有两个相关的概念&#xff1a;私有数据&#xff08;Private Data&#xff09;和暂态数据&#xff08;Transient Data&#xff09;。本文提供四个示例程序&#xff0c;分别对应私有数据和暂态数据的四种组合使用方式&#xff0c;并通过观察账本的交易以及…

窃隐私、放高利贷,输入法的骚操作真不少!

来源 | 编程技术宇宙责编 | 李雪敬封图 | CSDN 付费下载自视觉中国光说隐私泄露&#xff0c;人们总觉得似乎离自己很远&#xff0c;然而它早已像一个“地雷”&#xff0c;悄悄埋进了我们的生活中&#xff0c;不是不爆&#xff0c;时候未到。别认为自己只是社会中的一个小透明&a…

快速迁移 Next.js 应用到函数计算

首先介绍下在本文出现的几个比较重要的概念&#xff1a; 函数计算&#xff08;Function Compute&#xff09;: 函数计算是一个事件驱动的服务&#xff0c;通过函数计算&#xff0c;用户无需管理服务器等运行情况&#xff0c;只需编写代码并上传。函数计算准备计算资源&#xff…

为什么字节跳动、腾讯、阿里都在用Python??

Python 作为一种解释型技术脚本语言&#xff0c;越来越被认可为程序员新时代的风口语言。 无论是刚入门的程序员&#xff0c;还是年薪百万的 BATJ 的技术大牛都无可否认&#xff1a;Python的应用能力是成为一名码农大神的必要项。 而作为Python初学者来讲&#xff0c;最大的问题…

Need to upgrade docker package to 17.06.0+. Docker升级到最新版本

文章目录1. 现象2. 查找3. 在线卸载4. 升级docker5. 重启Docker6. 设置Docker开机自启7. 查看版本背景&#xff1a; 在搭建docker私有仓库的时候出现以下错误&#xff0c;版本太低 1. 现象 Need to upgrade docker package to 17.06.0.2. 查找 查找主机上关于Docker的软件包 …

云数据库RDS基础版的优势及适用场景

云栖号快速入门&#xff1a;【点击查看更多云产品快速入门】 不知道怎么入门&#xff1f;这里分分钟解决新手入门等基础问题&#xff0c;可快速完成产品配置操作&#xff01; 阿里云的产品系列包括基础版、高可用版、集群版、三节点企业版&#xff0c;本文介绍基础版的相关信息…

全方位事件监控管理,阿里云日志服务Kubernetes事件中心正式上线

2020年2月21日&#xff0c;阿里云日志服务Kubernetes事件中心正式上线&#xff0c;为Kubernetes事件提供集中化采集、存储、分析、可视化、告警等能力&#xff0c;帮助Kubernetes使用者快速构建准实时、高可靠、全方位的事件监控管理。 据介绍&#xff0c;Kubernetes事件中心能…

docker Harbor2.3.4 http 搭建镜像仓库

文章目录一、环境准备1. 环境要求2. 节点总览3. 安装docker-compose二、安装harbor2.1. 下载2.2. 解压2.3. 调整配置2.5. 安装 harbor2.6. 效果验证三、Docker开启远程API3.1. 修改配置3.2. 支持http3.3. 重新启动Docker服务3.4. 防火墙管理3.5. 重新启动3.6. 监控状态四、测试…

下一代 IDE:Eclipse Che 究竟有什么奥秘?

来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;Eclipse Che被Eclipse官方称为下一代IDE&#xff0c;作为老牌的IDE&#xff0c;被其寄予厚望的Eclipse Che到底有什么特点&#xff0c;在这篇文章中我们来一探究竟。开发团队的Kuberentes原生IDEEclipse Che对开发团…

助力在线教育,阿里云推出百万专项扶持基金计划

云栖号&#xff1a;https://yqh.aliyun.com 第一手的上云资讯&#xff0c;不同行业精选的上云企业案例库&#xff0c;基于众多成功案例萃取而成的最佳实践&#xff0c;助力您上云决策&#xff01; 前话 提供一个思路帮助你了解区块链基础运作&#xff0c;文本并不是一个完整的…

【开发者成长】阿里代码缺陷检测探索与实践

目前PRECFIX技术已经在阿里巴巴集团内部落地并获得好评&#xff1b;关于“PRECFIX”技术的论文被国际软件工程大会&#xff08;ICSE&#xff09;收录。 张昕东(别象) 阿里巴巴 云研发事业部 算法工程师 【以下为别象分享实录】 阿里巴巴在缺陷检测技术方面遇到的三个挑战 编码…

docker Harbor2.3.4 https 搭建镜像仓库

文章目录一、环境准备1. 环境要求2. 节点总览3. 安装docker-compose二、安装harbor2.1. 下载2.2. 解压2.3. 认证2.4. 调整配置2.5. 安装 harbor2.6. 配置host2.7. 效果验证三、客户端3.1. 证书保存3.2. 新建配置3.3. 登录harbor四、基本操作4.1. 下线4.2. 监控状态4.3. 重新部署…

OPPO实时数仓揭秘:从顶层设计实现离线与实时的平滑迁移

一、建设背景 关于 OPPO 移动互联网业务 大家都认为 OPPO 是一家手机公司&#xff0c;但大家可能并不清楚&#xff0c;其实 OPPO 也会做与移动互联网相关的业务。在 2019 年 12 月&#xff0c;OPPO 发布了自己定制的手机操作系统 ColorOS 7.0 版本。目前包括海外市场在内&…

十年技术骨干面试被开出一万五薪资,直呼 “这是对我的侮辱”

老周是我十多年前认识的同事&#xff0c;2012年前后&#xff0c;老周到北京工作的第一个任务就是为公司的产品开发IOS APP。2012年底&#xff0c;老周已经能熟练的驾驭苹果的cocoatouch和android核心组件。也正因为如此&#xff0c;老周的薪水直接翻倍&#xff0c;当时已经拿到…

微信小程序---实现弹窗效果

第一步&#xff1a;点击按钮触发弹窗事件 <button class"btn" bindtap"btn">按钮</button> *** css样式 .btn{ position: fixed; bottom: 0; left: 0; } *** js btn(){ let delshow !this.data.delshow console.log(delshow) this.setD…

登录 Harbor response from daemon: Get “https://192.168.92.129/v2/“: x509: cannot validate certificate

文章目录1. 现象2. 解决方案3. 重新登陆1. 现象 [rootlocalhost harbor]# docker login 192.168.92.129 Username: admin Password: Error response from daemon: Get "https://192.168.92.129/v2/": x509: cannot validate certificate for 192.168.92.129 becaus…

基于Flink的超大规模在线实时反欺诈系统的建设与实践

作者&#xff1a;关贺宇 在大数据时代&#xff0c;金融科技公司通常借助消费数据来综合评估用户的信用和还款能力。这个过程中&#xff0c;某些中介机构会搜集大量的号并进行“养号”工作&#xff0c;即在一年周期里让这些号形成正常的消费、通讯记录&#xff0c;目的是将这些…

别再被 Python 洗脑了!!

Python 作为一种解释型技术脚本语言&#xff0c;越来越被认可为程序员新时代的风口语言。无论是刚入门的程序员&#xff0c;还是年薪百万的 BATJ 的技术大牛都无可否认&#xff1a;Python的应用能力是成为一名码农大神的必要项。 而作为Python初学者来讲&#xff0c;最大的问题…