Postgresql中检测内存越界或use after free的简便方法

news2024/11/24 20:41:55

1 使用场景

在Postgresql的内存管理模块中,最常用的aset.c提供的内存池实现,该实现提供了两个非常实用的开关来解决常见的内存越界问题:

memdebug.c

 *	About CLOBBER_FREED_MEMORY:
 *
 *	If this symbol is defined, all freed memory is overwritten with 0x7F's.
 *	This is useful for catching places that reference already-freed memory.
 *
 *	About MEMORY_CONTEXT_CHECKING:
 *
 *	Since we usually round request sizes up to the next power of 2, there
 *	is often some unused space immediately after a requested data area.
 *	Thus, if someone makes the common error of writing past what they've
 *	requested, the problem is likely to go unnoticed ... until the day when
 *	there *isn't* any wasted space, perhaps because of different memory
 *	alignment on a new platform, or some other effect.  To catch this sort
 *	of problem, the MEMORY_CONTEXT_CHECKING option stores 0x7E just beyond
 *	the requested space whenever the request is less than the actual chunk
 *	size, and verifies that the byte is undamaged when the chunk is freed.

简单总结如下:

  • CLOBBER_FREED_MEMORY:
    • 如果定义了这个符号,所有释放的内存都会被覆盖为0x7F。这对于捕捉引用已释放内存的地方非常有用。
  • MEMORY_CONTEXT_CHECKING:
    • 由于我们通常将请求的大小舍入到下一个2的幂,所以在请求的数据区域之后通常会有一些未使用的空间。因此,如果有人犯了常见的错误,超出了他们请求的范围,问题可能会被忽视…直到更换平台后,没有这种空间未使用空间,导致内存越界使用的问题才被发现。

其实这两个宏在打开USE_ASSERT_CHECKING的使用就默认会生效。所以建议configure时记得打开enable_cassert。

/*
 * Define this to cause pfree()'d memory to be cleared immediately, to
 * facilitate catching bugs that refer to already-freed values.
 * Right now, this gets defined automatically if --enable-cassert.
 */
#ifdef USE_ASSERT_CHECKING
#define CLOBBER_FREED_MEMORY
#endif

/*
 * Define this to check memory allocation errors (scribbling on more
 * bytes than were allocated).  Right now, this gets defined
 * automatically if --enable-cassert or USE_VALGRIND.
 */
#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
#define MEMORY_CONTEXT_CHECKING
#endif

2 原理

2.1 MEMORY_CONTEXT_CHECKING

下面讲讲这两宏的原理,也比较简单:

正常我们申请内存都是会向上对齐到2的幂上,比如申请5个字节实际上会分配8个字节出来,但是你只应该使用5个字节。
在这里插入图片描述
但是如果你内存越界访问到第六个字节后,实际上是不会发生任何破坏的,因为这第六个字节也没有人会用,释放时也不可能发现。这就造成了隐患(这类问题都比较难差会有奇怪的逻辑报错)。

如果打开MEMORY_CONTEXT_CHECKING宏后:

在这里插入图片描述

2.2 CLOBBER_FREED_MEMORY

还有use after free的场景,因为在pfree时,内存块中的内容不会立即被覆盖或重写,很可能发生上面已经free了,但后面还能正常用的场景,在某些串行逻辑下,貌似一直都不会出现问题,这也埋下了隐患(这类问题都比较难差会有奇怪的逻辑报错)。

打开CLOBBER_FREED_MEMORY后,释放时会调用wipe_mem将内存覆盖成0X7F

static inline void
wipe_mem(void *ptr, size_t size)
{
	VALGRIND_MAKE_MEM_UNDEFINED(ptr, size);
	memset(ptr, 0x7F, size);
	VALGRIND_MAKE_MEM_NOACCESS(ptr, size);
}

后面aset不会对0x7F做任何检查逻辑,因为没准你的数据就全是0x7F。但是memset后,肯定会将pfree的地址的数据立即覆盖掉,让后面使用者能尽早发现问题(看到一堆0x7F就知道是用了free后的地址了)。

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

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

相关文章

git之工作中实际应用篇(非常适合刚到公司上班但是git不太熟又不好意思问同事的友友)

目录 前言当你刚到一个公司写代码,交自己的分支提交并推送了代码,但是有所更改第二天拉取代码切换分支远程分支太多&&本地仓库太多checkout检出失败的情况未完待续 前言 此篇用于记录笔者在工作中用到git遇到的问题及大部分的操作。 区别于理论…

无涯教程-JavaScript - FALSE函数

描述 FALSE函数返回逻辑值FALSE。 语法 FALSE () 争论 FALSE函数没有参数。 Notes 您还可以在工作表或公式中直接键入FALSE单词,Microsoft Excel会将其解释为逻辑值FALSE。 提供FALSE功能主要是为了与其他电子表格程序兼容。 适用性 Excel 2007,Excel 2010,Excel 2013…

【用unity实现100个游戏之11】复刻经典mirror消消乐游戏

文章目录 前言开始项目开始一、方块网格生成二、方块交换三、添加交换的动画效果四、水平消除检测五、垂直消除检测六、完善删除功能七、效果优化(移动方块后再进行消除检测)八、方块下落十、方块填充十一、后续 源码参考完结 前言 欢迎来到经典消消乐游…

数据清洗:数据挖掘的前期准备工作

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

释放潜能!RunnerGo:性能测试的全新视角

在数字化时代,性能测试已成为企业持续发展的关键一环。但面对繁杂的工具和流程,很多企业却陷入了无从选择的困境。现在,一款名为RunnerGo的全新性能测试工具正悄然崭露头角。 RunnerGo,一款由国内开发者自主研发的全栈式性能测试…

最新模块化设计小程序系统源码完整版:开源可二开,支持DIY

随着互联网的快速发展,小程序已成为各行各业开展业务的重要工具。而模块化设计小程序系统源码完整版则是一种高效、灵活、易维护的解决方案。 分享一个最新的模块化设计小程序系统源码完整版,源码开源可二开,支持自由DIY设计,含完…

华为云新用户:定义,优惠券及专享活动

在当今的数字化时代,云计算已成为企业与个人的必备服务。华为云,作为全球领先的云计算服务提供商,吸引了众多新用户的关注。本文将详细介绍华为云新用户的定义、优惠券及专享活动相关内容,帮助大家更好地了解华为云新用户优惠政策…

win10win11截图技巧——不用安装其他截图工具或者运行其他截图工具,就可以截图,win10和win11可用

快捷键shift wins可以调出来windows自带的截图工具。 测试了一下win10和win11都可以用。 可以截图的方式有: 1,全屏截图, 2,窗口截图, 3,任意截图, 4,画矩形截图 以下内容来自…

算法竞赛入门【码蹄集新手村600题】(MT1280-1300)C语言

算法竞赛入门【码蹄集新手村600题】(MT1280-1300)C语言 目录MT1281 N的M次方MT1282 Disarium数MT1283 区间Disarium数MT1284 快乐数MT1285 忠实数MT1286 忠实数序列MT1287 ASCII值MT1288 谁在说谎MT1289 调和级数不等式MT1290 级数MT1291 级数IIMT1292 某级数MT1293…

一百七十七、Hive——海豚调度执行Hive的.sql文件

一、目的 对于Hive数仓,每一层的建库建表SQL语句都各自放在一个.sql文件里,然后用海豚调度执行一下Hive的.sql文件 二、实施步骤 (一)第一步,上传.sql文件到海豚调度器上 (二)第二步&#xf…

分享一个java技术开发的springboot线上问卷调查可视化系统源码 lw 调试

💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…

帝国CMS的Sitemap网站地图生成插件下载及教程

具体使用方法: 第一步:解压下载 stitemap 压缩包; 第二步:修改config.php里的网址为自己的网址。 1、如果网站站点是响应式的直接选择pc即可。 2、如果电脑站和手机站不一样则都需要修改。 第三步:将解压出的“sitema…

4.docker容器编排(docker compose 与 docker swarm)

本文目录 1.容器编排2.Docker Compose1.Docker Compose 安装2.Docker Compose 示例1.使用 docker-compose 启动 nginx2.docker compose 常用命令3.校验 docker-compose.yml 是否有错误4.创建服务&#xff0c;启动容器5.弹性伸缩<扩缩容> 3.Docker Swarm1.Swarm 架构图2.S…

华为云云耀云服务器实例管理域名

目录 域名概述 通过域名访问网站流程 域名注册、解析和备案的关系 域名解析 如何修改 域名概述 部署一个网站或Web应用后&#xff0c;若要使该网站能够在Internet上通过域名直接访问&#xff0c;需要为网站注册域名、备案以及配置解析。 通过域名访问网站流程 1、注册域…

虚拟电影 故事板创作 Frameforge Studio 4.0.6 Crack

虚拟电影工作室 故事板创作 Frameforge Storyboard Studio 4.0.6 是一个功能齐全的故事板程序&#xff0c;由著名导演及其要求共同创建。该软件将节省大量的时间&#xff0c;金钱和头痛&#xff0c;如果你是一个导演&#xff0c;在电影行业工作或VFX主管-这就是你要找的&#x…

小程序分销商城功能展示;

很多客户想要搭建自己的小程序商城&#xff0c;各家公司报价也是从几百到几千都不等&#xff0c;那么商城小程序开发到底需要多少钱呢&#xff1f;商城小程序一般要做哪些功能呢&#xff1f; 1、商品展示 一个商城型小程序&#xff0c;商品展示功能是必须要有的&#xff0c;这…

全球与中国BGO晶体市场:增长趋势、竞争格局与前景展望

BGO晶体&#xff0c;全名为Bismuth Germanate Scintillation Crystal&#xff08;铋锗酸盐闪烁晶体&#xff09;&#xff0c;是一种用于探测放射性粒子和射线的闪烁晶体材料。它的主要成分是铋氧化物&#xff08;Bi4Ge3O12&#xff09;&#xff0c;其中铋和锗的特性使得这种晶体…

用 Canvas 画简易手电筒

本文章适合人群: 具备 html、js 基础的人对于想入门 canvas 的人 本文章较为简单&#xff0c;大佬可略过 实验结果 一个跟随着鼠标移动的圆圈。 教学 要实现一个动态手电筒效果&#xff0c;我们可以使用Canvas来绘制一个黑色的遮罩层&#xff0c;并通过鼠标或触摸事件来控…

JLink更新固件成砖头的QA

问题&#xff1a;用了新版的keil&#xff0c;更新固件后不能用了&#xff0c;怎么办啊 插上Jlink之后&#xff0c;驱动提醒您更新最新的V11版本固件&#xff0c;然后点了更新&#xff0c;更新结束之后/重新上电之后&#xff0c;Jlink的灯会变成红色闪烁5次然后变绿色&#xff0…

本地项目上传至码云gitee

1、springboot-mgx是需要上传的项目 2、码云后台创建一个新的仓库 3、创建完成后&#xff0c;复制下来https链接&#xff0c;后面要用到。 4、进入项目要上传的文件中 5、对git进行初始化&#xff0c;git指令 git init 6、 上传项目至gitee &#xff08;1&#xff09;连接远…