【嵌入式】“野指针”和“悬空指针”的奇淫拙劣

【嵌入式】“野指针”和“悬空指针”的奇淫拙劣

  • 1. 前言
    • 1.1 授权须知
  • 2. 野指针和悬空指针
  • 3.举例说明
    • 3.1 示例一:free 之后,没有让指针指向NULL
      • 3.1.1 代码解析
      • 3.1.2 运行代码的结果
      • 3.1.3 程序崩溃在哪?
    • 3.2 悬空指针–释放后使用攻击

1. 前言

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39217004/article/details/137683500

1.1 授权须知

转载文章,禁止声明原创;不允许直接二次转载,转载请根据原文链接联系作者

若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
但对于未注明转载来源/原文链接的文章,我将保留追述的权利。

作者:积跬步、至千里

若需要修改文章的排版,请根据原文链接联系作者
再次感谢您的认可,转载请遵守如上转载须知!

———————————————————————————————————————————

2. 野指针和悬空指针

  • 悬空指针(Dangling Pointer):是指一个指针变量保存了一个 无效的内存地址的情况。

    • 情况1: 指针被释放后,没有指向 NULL则该指针大概率是还指向之前指向的地址,然而该地址接下来已经被其他变量使用
    • 情况2:指针指向了一个非静态局部变量的地址; 如数组越界,如函数中返回了局部变量的地址
  • 野指针(Wild Pointer):是指一个未初始化或未赋值的指针,它 不知道所指向的内存地址。野指针可能包含任意值,它没有被正确地分配或初始化。

关于野指针的描述,参考: 【嵌入式】让人又爱又恨的“指针”

建议调用 free 函数的时候,自己写一个宏定义

#define FREE(p) free(p); \
                p = NULL;

3.举例说明

3.1 示例一:free 之后,没有让指针指向NULL

void fun(char **p){
    *p = (char *)malloc(100);
}

int main{
    char *p = NULL;
    fun(&p);
    free(p);

    if(p!=NULL){
        strcpy(p,"hello world");
        printf(p);
    }
}

3.1.1 代码解析

  • main函数定义了一个指针变量p,然后将其地址传递给fun函数
  • fun函数使用malloc函数在堆上分配了100个字节的空间,并把这块内存的地址赋值给了p
  • 回到main函数中,紧接着调用free函数释放刚刚分配的内存。

free§之后,指针变量p没有及时置空,仍然还是指向着这片内存地址;但p指向的这片内存已经被回收了,这时候使用strcpy向其写入数据,到底会造成什么后果就难以预料了。

3.1.2 运行代码的结果

【结果难以预料】

  • 运气好的话,字符串能够成功复制,也能成功打印出"hello world"字符串,
  • 运气不好的话,会报错,Segmentation fault
    在这里插入图片描述

3.1.3 程序崩溃在哪?

崩溃是在哪一行呢?是strcpy写入数据的时候崩溃,还是printf打印输出的时候崩溃呢?

答案是printf的时候崩溃了

  • 虽然通过调用free把这块内存释放了,但要注意,这个释放只是C语言运行时库层面的释放(因为free函数是C语言的库函数),C语言运行时库里的算法把它回收回去,在编程语言的层面上,这块内存是不应该再访问的了。
  • 但在操作系统的层面上,这块内存依然是可以访问的,它依然位于某个具有可读可写的4KB内存页中。因为C语言的堆内存分配算法,不会每次释放内存都调用系统级的函数(如VirtualFree)去真正释放内存页面,这是一个很重的操作。

这里所谓的free,仅仅是告诉C语言运行时库,这块内存我不用了,你回收回去统一管理吧。

所以,当调用strcpy的时候,是能够正常复制的。

但要注意,这块内存能写,不代表你能乱写。在操作系统层面上,内存页面可读可写,那你写没有问题。

但站在C语言运行时库的视角来看,这个地址的内容我已经回收了,现在这里面的内容对于我管理堆内存非常重要,你别乱写,乱写是要出乱子的。

这不,这样一strcpy,哦豁,堆内存里面的一些管理用的设施被破坏了(比如一些指针),等到后面调用printf的时候,里面同样要从堆分配内存,这个时候前面留下的问题就暴露出来了。

3.2 悬空指针–释放后使用攻击

void fun(char **p){
    *p = (char *)malloc(100);
}

int main()
{   
    char *p = NULL;
    fun(&p);
    strcpy(p,"hello world \r\n");
    printf(p);
    free(p);

    char *q = NULL;
    fun(&q);
    strcpy(q,"zhang san \r\n");
    printf(p);
}
  • 我先给指针p分配了100个字节,里面填充了"hello, world"之后,打印输出,随后释放指针p的内存。
  • 但要注意,我释放后,没有把p置空
  • 紧接着,我又调用malloc分配了100个字节给指针q,随后给它指向的内存填充了"zhangsan"。
  • 但好玩的来了,我接下来还是打印p,不是打印q,居然把指针q的内容给我打印出来了。

在这里插入图片描述
查看堆栈,发现 p 和 q 指向的是同一片内存地址
在这里插入图片描述

这是利用了C语言运行时库堆内存分配算法的特点,把上面刚刚free归还的100个字节,又分配给新的q了,而p又还没有置空,就出现了p和q同时指向了这块内存。

在这里插入图片描述
参考文章链接:
https://mp.weixin.qq.com/s/e5TlFOP3M7HiavoHMPH7-g

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】LInux下的进程状态

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…

自学编程两个月,现在我月入 4 万元

这个外国小哥叫 Nico,他一开始是个编程小白,后来把自己关在房间里花了两个月时间学会了编程,如今正在开发一款名为 Talknotes 的应用,可以将语音备忘录转化为结构化的内容,月收入 5000 美元。 Nico 从高中毕业就开始创…

Linux蓝牙驱动模拟HID设备(把Linux系统模拟成蓝牙鼠标和蓝牙键盘)

by fanxiushu 2024-04-24 转载或引用请注明原始作者。 在经过windows的蓝牙驱动开发模拟成HID设备的大风大浪之后, 现在回到linux下实现相同功能,简直就是如小孩嬉闹一样的轻松。 但无论如何,作为模拟蓝牙HID设备的windows,linux一…

导出瑞芯微(Rockchip)芯片的设备树(Device Tree)

要导出瑞芯微(Rockchip)芯片的设备树(Device Tree),可以使用设备树编译器(DTC,Device Tree Compiler)。通常,会有一个设备树的源文件(.dts)&#…

安装Selenium

安装Selenium 【0】引言 ​ 由于sleenium4.1.0需要python3.7以上方可支持,请注意自己的python版本。 【1】使用Pycharm安装 使用 快捷键 Ctrl Alt S 【2】使用 pip 安装 Python3.x安装后就默认就会有pip(pip.exe默认在python的Scripts路径下&…

代码随想录算法训练营第四十九天| LeetCode121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

一、LeetCode121. 买卖股票的最佳时机 题目链接/文章讲解/视频讲解:https://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BA.html 状态:已解决 1.思路 学了双指针的同学可能会下…

「ETL趋势」FDL数据中心库/表查看和调试功能上线、数据源新增支持MongoDB写入

FineDataLink作为一款市场上的顶尖ETL工具,集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具,进行了新的维护迭代。本文把FDL4.1.6最新功能作了介绍,方便大家对比:(产品更新详情:…

float类型的存储

float类型的存储 在计算机科学中,float类型通常指的是单精度浮点数。它是一种用于近似表示实数的方法,特别适用于表示很大或很小的数。float类型在大多数编程语言中遵循IEEE 754标准,这是一个国际标准,用于确保在不同计算机和编程…

了解DNS洪水攻击

域名系统 (DNS) 服务器是互联网的“电话簿“;互联网设备通过这些服务器来查找特定 Web 服务器以便访问互联网内容。在互联网中,DNS 洪水是一种网络攻击方式。 DNS 洪水攻击是一种分布式拒绝服务 (DDoS) 攻击,攻击者用大量流量淹没某个域的 D…

【苍穹外卖】Redis缓存菜品数据-业务逻辑分析

目录 Redis缓存菜品数据-业务逻辑分析1. 需求2. 需要考虑的问题3. 缓存逻辑分析4. 缓存流程图 Redis缓存菜品数据-业务逻辑分析 1. 需求 在菜品展示页面,用户点击每一个分类都会访问一次MySQL数据库数据,当大量用户使用发出大量请求时,会对…

【题目2】 大衍数列,斐波拉契数列等,用VBA 和python解决

目录 0 原始题目:大衍数列 0.1 原始题目 0.2 知识点 1 大衍数列 1.1 大衍数列定义 1.1.1 大衍数列定义 1.1.2 大衍数列注意点 1.2 用VBA实现大衍数列 1.3 用python实现大衍数列 2 斐波拉契数列 /兔子数列/ 黄金分割数列 2.1 斐波拉契数列定义 2.1.1 下面…

AI预测福彩3D第9套算法实战化测试第1弹2024年4月24日第2次测试

今天继续进行新算法的测试,今天是第2次测试。好了,废话不多说了,直接上图上结果。 2024年4月24日福彩3D预测结果 6码定位方案如下: 百位:1、0、2、3、6、7 十位:2、4、1、6、0、5 个位:3、2、4、…

第二证券|股票做短线要关注什么?

在股市中短线交易因其快速的盈利时机而招引了众多投资者,但做短线想要挣钱也不是那么容易的。对于股票做短线要重视什么,第二证券下面就为我们具体介绍一下。 短线交易需重视: 1、商场短期趋势。短线投资者首先需要重视的是全体商场趋势&am…

jsp实验11 JavaBean

二、实验项目内容(实验题目) 编写代码,掌握javabean的用法。【参考课本 上机实验 5.5.2 】 三、源代码以及执行结果截图: 源代码: Memory.java package sea.water; import java.util.ArrayList; import java.util…

C语言实现简单CRC校验

目录 一、实现题目 二、send模块 三、receive模块 四、运行截图 一、实现题目 二、send模块 #include <stdio.h> #include <string.h>// 执行模2除法&#xff0c;并计算出余数&#xff08;CRC校验码&#xff09; //dividend被除, divisor除数 void divide…

基于STM32的DAC简易信号发生器设计(HAL库)

前言&#xff1a;本文为手把手教学制造 DAC 简易信号发生器的教程&#xff0c;本教程的 MCU 使用 STM32F103ZET6 。以 HAL 库的 DAC 函数作为代码基础进行编程&#xff0c;使得信号发生器可以产生各种类型的信号波&#xff0c;包括&#xff1a;方波、三角波、正弦波和噪声波&am…

kafka部分partition的leader=-1修复方案整理

kafka部分partition的leader-1修复方案整理 1. 背景说明2. 修复测试2.1 创建正常的topic并验证生产和消费2.2 停止kafka模拟leader-12.3 修复parition2.4 修复完成验证生产消费是否恢复 3. 疑问和思考3.1 kafka在进行数据消费时&#xff0c;如果有partition的leader-1&#xff…

新火种AI|Devin再次震撼谷歌!但却是以被质疑造假的方式...

作者&#xff1a;小岩 编辑&#xff1a;彩云 我们常说有人的地方就有江湖&#xff0c;就会存在炒作&#xff0c;扒皮和虚伪。没想到&#xff0c;到了人工智能这里&#xff0c;也是一样。 4月9日&#xff0c;一位自称有35年软件工程师经验的网络博主卡尔逐帧复现了人工智能软…

09—DOM和BOM

一、DOM 1、HTML DOM (文档对象模型) 文档对象模型&#xff08;Document Object Model&#xff0c;DOM&#xff09;是表示和操作HTML和XML文档内容的基础API。当网页被加载时&#xff0c;浏览器会根据DOM模型&#xff0c;将结构化文档&#xff08;比如HTML和XML&#xff09;解…

2024年低碳技术与污染控制技术国际学术会议(ICLCTPCT 2024)

2024年低碳技术与污染控制技术国际学术会议(ICLCTPCT 2024) 2024 International Conference on Low carbon technology and pollution control technology 一、【会议简介】 2024年低碳技术与污染控制技术国际学术会议&#xff0c;是交流科研成果的绝佳平台。 这次会议将汇集世…
最新文章