gpt4 book ai didi

c - 内存覆盖问题

转载 作者:太空宇宙 更新时间:2023-11-04 03:08:20 25 4
gpt4 key购买 nike

我有一个 C 代码应用程序。我正在使用 MS-VS2005 构建它。我有一个使用 malloc 动态分配的输出数据缓冲区。

对于某些测试用例,被 malloc 的内存大小低于生成的实际输出大小(以字节为单位)。较大尺寸的输出被写入较小尺寸的缓冲区,导致缓冲区溢出。结果,测试运行崩溃,MSVS-2005 显示一个窗口“Heap corruption ....”

我知道它与一些动态内存分配有关,但我花了很长时间才真正找到根本原因,因为我不怀疑内存分配,因为我分配了足够大的输出所需的大小。但是一个特定的测试用例产生的输出比我计算的要多,因此导致了崩溃。

我的问题是:

1.) 我可以使用哪些工具来检测此类动态内存缓冲区溢出情况。它们还可以帮助检测任何缓冲区溢出情况(无论缓冲区/数组是否在堆、堆栈、全局内存区域上)吗?

2.) 内存泄漏工具(比如 Purify)或代码分析工具(比如 lint、klocworks)在特定情况下会有帮助吗?我相信它们必须是运行时分析工具。

谢谢。

-广告。

最佳答案

一种解决方法,我第一次遇到是在书上Writing Solid Code ,是用诊断代码“包装”malloc() API。

首先,诊断 malloc() 安排为尾随标记分配额外的字节。例如,分配的内存后面的另外四个字节被保留并包含字符“FINE”。

稍后,当 malloc() 的指针传递给 free() 时,将调用相应的诊断版本的 free() .在调用 free() 的标准实现并释放内存之前,尾随的哨兵被验证;它应该是未修改的。如果标记被修改,则 block 指针在从诊断 malloc() 返回后的某个时刻被滥用。

使用内存保护保护页面而不是哨兵模式来检测缓冲区溢出有很多优点。特别是,使用基于模式的方法,非法内存访问只能在事后检测到。哨兵模式方法只检测非法写入。内存保护方法捕获非法读取和写入,并在它们发生时立即检测到。

malloc() 的诊断包装函数还可以解决 malloc() 的其他误用,例如多次调用 free()相同的内存块。此外,realloc() 可以修改为在调试环境中执行时始终移动 block ,以测试 realloc() 的调用者。

特别是,诊断包装器可能会记录所有分配和释放的 block ,并在程序退出时报告内存泄漏。内存泄漏是在程序执行期间分配的未释放的 block 。

包装malloc() API 时,必须包装所有相关函数,包括calloc()、realloc()、strdup()

包装这些函数的典型方法是通过预处理器宏:

#define malloc(s)   diagnostic_malloc(s, __FILE__, __LINE__)/* etc.... */

如果需要编写对标准实现的调用(例如,分配的 block 将传递给第三方,仅二进制库,该库期望使用标准 free() 释放 block 实现,可以使用 (malloc)(s) 访问原始函数名称而不是预处理器宏——也就是说,在函数名称周围放置括号。

关于c - 内存覆盖问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1765295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com