返回顶部
首页 > 资讯 > 前端开发 > html >进入编译器后一个函数经历了什么
  • 358
分享到

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

2024-04-02 19:04:59 358人浏览 八月长安
摘要

这篇文章主要介绍“进入编译器后一个函数经历了什么”,在日常操作中,相信很多人在进入编译器后一个函数经历了什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”进入编译器后一个函数

这篇文章主要介绍“进入编译器后一个函数经历了什么”,在日常操作中,相信很多人在进入编译器后一个函数经历了什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”进入编译器后一个函数经历了什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

 我是一个函数

我是一个函数,名叫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说,一会儿我们就要一起被送到一个叫编译器的地方加工处理了,我心里害怕极了。

编译器之旅

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

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

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

  • 预处理

  • 词法分析

  • 语法分析

  • 语义分析

  • &middot;&middot;&middot;

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

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

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

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

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

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

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

函数调用约定

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

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

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

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

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

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

“一般有三种:”

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

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

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

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

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

Stack Canary

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

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

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

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

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

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

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

char upper[256];

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

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

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

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

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

“很聪明嘛!”

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

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

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

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

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

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

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

链接

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

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

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

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

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

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

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

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

到此,关于“进入编译器后一个函数经历了什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 进入编译器后一个函数经历了什么

本文链接: https://lsjlt.com/news/84698.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 进入编译器后一个函数经历了什么
    这篇文章主要介绍“进入编译器后一个函数经历了什么”,在日常操作中,相信很多人在进入编译器后一个函数经历了什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”进入编译器后一个函数...
    99+
    2024-04-02
  • 解析在浏览器地址栏输入一个URL后发生了什么
    目录一、前言二、解析 URL三、浏览器封装 HTTP 请求报文四、DNS 域名解析获取 IP 地址五、建立 TCP 连接六、浏览器发送请求七、负责传输的 IP 协议八、使用 ARP ...
    99+
    2024-04-02
  • 为什么没有一个内置的closed函数用来检查通道是否已经关闭?
    这篇文章将为大家详细讲解有关为什么没有一个内置的closed函数用来检查通道是否已经关闭?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。为什么没有内置的 closed() 函数来检查通道是否已关闭? Go...
    99+
    2024-04-02
  • javascript当前元素将要进入编辑状态使用什么函数,详细讲解
    这篇文章将为大家详细讲解有关javascript当前元素将要进入编辑状态使用什么函数,详细讲解,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JavaScript 编辑元素聚焦函数 JavaScript 提...
    99+
    2024-04-02
  • 了解申请一个云服务器时所需要的参数是什么
    云服务器的配置参数可以有很多种,以下是一些常见的参数: 容量:云服务器可以提供多大的可用云空间,这取决于所需的服务器资源、带宽以及用户数量。 带宽:云服务器可以提供多少带宽,这是根据用户数量而定的。 CPU:根据应用程序的运行方式,云服...
    99+
    2023-10-26
    所需要 参数 服务器
  • 了解申请一个云服务器时所需要的参数是什么内容
    云服务器的名称和版本:你需要选择一个适合你的云服务器,比如AWS S3或AWS Lambda等。 云服务器的大小:云服务器可以支持多少用户,如果超出了一定的限制,你需要考虑购买更大的服务器。 云服务器的配置:你需要考虑你的应用程序需要多大...
    99+
    2023-10-27
    所需要 参数 服务器
  • 了解申请一个云服务器时所需要的参数是什么意思
    云服务器的大小:一般来说,云服务器的大小是根据您的实际需求而定的,您可以选择一个较小的服务器,以满足您的需求。但您需要注意的是,小的云服务器可能会增加您的硬件和网络成本,因此需要权衡这些因素。 云服务器的配置:在申请云服务器之前,您需要选...
    99+
    2023-10-27
    所需要 参数 服务器
  • javascript一个外部对象被鼠标拖进当前窗口或者帧使用什么函数,详细讲解
    这篇文章将为大家详细讲解有关javascript一个外部对象被鼠标拖进当前窗口或者帧使用什么函数,详细讲解,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。外部对象拖放至窗口或帧的 JavaScript 函数...
    99+
    2024-04-02
  • javascript当对象被鼠标拖动的对象进入其容器范围内时触发此事件使用什么函数,详细讲解
    这篇文章将为大家详细讲解有关javascript当对象被鼠标拖动的对象进入其容器范围内时触发此事件使用什么函数,详细讲解,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 当鼠标拖动的对象进入其容器范围时触...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作