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

news2024/12/23 3:39:33

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

  • 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.coloradmin.cn/o/1620212.html

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

相关文章

JS----随机数字,字符,数组

随机数字 function random(min 0, max 100) {if (min > 0 && max > 0 && max > min) {const gab max - min 1return Math.floor(Math.random() * gab min)}return 0 }输入格式 随机字符 function randomStr (len 32) {var s for (; s.lengt…

产品经理好干吗?

赚钱的工作都不轻松吧,除非是家里资源好的。 产品经理的薪资还是可观的 ,小白如何成为产品经理? 首先要有经验,有理论知识,对想从事产品经理相关岗位的人来说,这基本是个必考的证书了,感兴趣的…

Java web应用性能分析之【Linux服务器性能监控分析概叙】

大多数场景,我们的Java web应用都是部署在linux环境,所以对linux服务器的性能指标需要有一个比较清晰的认识。Linux服务器的性能指标无非就5个方面:CPU、内存、磁盘、网络、文件系统。不同的性能指标都有对应的命令进行监控和查看&#xff08…

揭秘亚马逊、虾皮自养号测评:提升排名与流量的新策略

亚马逊一直是跨境电商平台中的佼佼者,每年新入驻亚马逊的商家也是非常多的,对于新入驻的卖家来说,如何在竞争激烈的市场中脱颖而出,增加流量并转化为订单,是摆在面前的重要任务。 一、亚马逊新店怎么增加流量&#xf…

验证线缆(汽车线束、网线、多芯线)破损或断开与正常线缆的区别在哪里?依AEM CV-100 k50测试仪

工厂产线生产的线缆(汽车线束、网线、多芯线)做成成品,即2端都安装好了模块。在这种情况下如何快速的判定此条线缆是合格的呢,此处的合格为物理层面上的合格(不会出现开路、短路),也就是最基本保…

pytorch-解决过拟合之regularization

目录 1.解决过拟合的方法2. regularization2. regularization分类3. pytorch L2 regularization4. 自实现L1 regularization5. 完整代码 1.解决过拟合的方法 更多的数据降低模型复杂度 regularizationDropout数据处理早停止 2. regularization 以二分类的cross entropy为例&…

前端三剑客 HTML+CSS+JavaScript ⑤ HTML文本标签

别困在过去,祝你有勇气开始,下一行 —— 24.4.24 一、文本标签 1.特点 1.用于包裹:词汇、短语等 2.通常写在排版标签里面(h1~h6、p、div) 3.排版标签更宏观(大段的文字),文本标签更微…

去雾笔记01-SRKTDN: Applying Super Resolution Method to Dehazing Task

文章目录 Abstract1. Introduction2. Related Work3. Method3.1. Network Architecture Abstract 们提出了一种结合超分辨方法和知识转移方法的模型。我们的模型由一个教师网络、一个去雾网络和一个超分辨率网络组成。 1. Introduction ECNU KT团队提出了一个知识蒸馏[20]模…

OpenAI 笔记:chat API

聊天模型接受一系列消息作为输入,并返回模型生成的消息作为输出。 1 导入openai 的api key from openai import OpenAIclient OpenAI(api_key***) 2 调用聊天API completion client.chat.completions.create(model"gpt-3.5-turbo",messages[{"…

09—DOM和BOM

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

3d模型合并怎么样不丢材质?---模大狮模型网

在3D设计中,合并模型是常见的操作,它可以帮助设计师将多个单独的模型组合成一个,从而简化场景并提高渲染效率。然而,合并模型时常常会面临一个棘手的问题:如何确保合并后的模型不丢失原有的材质?本文将探讨如何在合并…

Parallels Desktop 19完美中文版 PD19虚拟机详细图文安装教程 亲测兼容M1/M2

对于许多Mac用户来说,运行Windows应用程序是必不可少的。也许你的雇主使用的软件只适用于Windows,或者需要使用依赖于某些Windows技术的网站。或者你想在Mac上玩Windows游戏。或者,你可能需要在其他操作系统上测试应用程序和服务——你可以在…

【数据结构-图】

目录 1 图2 图的定义和基本概念(在简单图范围内)3 图的类型定义4 图的存储结构4.1 邻接矩阵 表示法4.2 邻接表 表示法4.3 十字链表 表示法4.4 邻接多重表 表示法 5 图的遍历5.1 深度优先搜索-DFS 及 广度优先遍历-BFS 6 图的应用6.1 最小生成树6.1.1 克鲁…

Azure AKS集群监控告警表达式配置

背景需求 Azure AKS集群中,需要对部署的服务进行监控和告警,需要创建并启用预警规则,而这里怎么去监控每个pod级别的CPU和内存,需要自己写搜索查询 解决方法 搜索和查询的语句如下,需要自己替换其中的部分信息,其中…

Qwen1.5微调

引子 由于工作上需要,一直在用Qwen做大模型推理,有个再训练的需求,特此琢磨下Qwen的训练。OK,我们开始吧。 一、安装环境 查看显卡驱动版本 根据官网推荐 OK,docker在手,天下我有。 docker pull qwenll…

vuetify3.0+tailwindcss+vite最新框架

1、根据vuetify官网下载项目 安装vuetify项目 2、根据tailwindcss官网添加依赖 添加tailwindcss依赖 3、 配置main.ts // main.ts import "./style.css"4、使用 <template><h1 class"text-3xl font-bold underline">Hello world!</…

sscanf和scanf区别

sscandf 从字符串中提取数据 scanf 标准输入流读取数据 int num; sscanf("42", "%d", &num);float f; sscanf("3.14", "%f", &f);char str[20]; sscanf("Hello, World!", "%s", str);int a, b; sscanf(…

信息系统项目管理师论文考察范围预测

在2023年下半年实施机考之前&#xff0c;论文的范围还是比较好预测的&#xff0c;因为从历年考题来看&#xff0c;可以说十大管理领域考察的概率接近100%&#xff0c;而且有一定规律&#xff0c;比如说某个管理领域很久没考了&#xff0c;那么考察的概率就相对大一点&#xff0…

路由过滤与引入实验

一.实验要求及拓扑 二.实验思路 1.配置IP地址及环回 2.配置OSPF协议及RIP协议 3.OSPF和RIP进行路由引入 4.在R2上配置路由过滤&#xff0c;使RIP部分无法学到R4业务网段的信息 5.在R4上进行路由过滤&#xff08;地址前缀列表&#xff09;&#xff0c;使 R4 无法学习到 R1…

centos7服务器系统如何安装宋体字文件

centos7服务器系统如何安装宋体字文件&#xff01; 最近开发的积德寺app,菩提佛堂祈福平台网站发布后&#xff0c;由于服务器之前遇到了攻击&#xff0c;数据丢失了&#xff0c;重新安装了一遍系统centos7.发现客户的功德证书创建后&#xff0c;字体乱码了。很明显是缺少了宋体…