c - 确保越界内存写入触发立即故障

标签 c memory-leaks malloc

我刚刚很难跟踪一个与内存分配相关的非常典型的 C 错误。我的缓冲区之一太短了一个字节。结果,超出上限写入了一个字节。

在大多数情况下,它没有效果;但在某些特定情况下,它会导致 future 的操作失败(通常是 malloc,或另一个函数中的隐藏 malloc)。

这种错误难以跟踪的原因是它们不会出现在错误所在的位置,从而导致错误的初步诊断。而且它也永远不会在 Debug模式下发生,这使得搜寻更加困难。

这种错误在 C 语言中很常见,也是该语言长期存在的弱点。

那么什么可以帮助那里呢?

好吧,如果“一个字节太多”的写入立即触发错误,这将真正有帮助,首先要检测问题出在哪里,还要检测是否存在问题! (在前面的示例中,错误通过了所有测试并进入了生产阶段;噩梦般的情况……)。

是否存在这样的设置(在 C 中)? 我猜想如果存在某种解决方案,它可能取决于平台。但是,当然,如果存在可移植的,我会更感兴趣。

[编辑] 感谢您提供非常好的答案。我看到没有银弹解决方案,但有一套工具可以减轻这个问题。我需要一些时间来研究您的答案中提供的所有非常好的链接。

最佳答案

用正常触发立即故障可能很困难。有alternatives但是要解决这个问题。我最喜欢的是在 valgrind 下运行该程序:任何有趣的业务都会被标记为非法读取或非法写入。

这是一个简单的错误程序:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char *p = malloc(10);
    p[10] = 42;

    return 0;
}

这是我在 valgrind 下运行时得到的结果:

==11551== Invalid write of size 1
==11551==    at 0x40052A: main (main.c:7) # <------ compile with debugging symbols
==11551==  Address 0x51b904a is 0 bytes after a block of size 10 alloc'd
==11551==    at 0x4C28BED: malloc (vg_replace_malloc.c:263)
==11551==    by 0x40051D: main (main.c:6)
==11551== 

任何侵入性较小的东西都可能具有较小的粒度(即它可能会错过一些非法访问)。我链接的 wiki 页面有很多适用于各种平台的替代方案。

关于c - 确保越界内存写入触发立即故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18088821/

相关文章:

C 在汇编程序中隐藏文件

c - 指向多维数组的指针数组

c - malloc 提供了哪些关于低阶位的保证?

c - 在一个字节中存储 4 个不同的值

c - 在 for 循环中添加 { - } : c programming

javascript - 使用 AJAX JSON 调用时内存泄漏

c++ - Stack.pop 内存管理

java - 难以捉摸的 Java 内存泄漏

c++ - 在 C++ 中使用 malloc 后的行为

c - 如果在循环中多次调用 malloc() 和 realloc() 则多次 free()ing