【问题标题】:Force relocation with realloc使用 realloc 强制重定位
【发布时间】:2018-04-06 12:01:58
【问题描述】:

我目前正在用 C 语言编写一个大量面向数据的库。在过去的几个小时里,我一直在寻找一个段错误,该段错误是由于在库深处使用 realloc 进行内存重定位而导致的悬空指针引起的。由于这个错误只是由于库的另一部分中的内存泄漏而发生的,我想知道是否有办法使这类错误更具重现性。

我有一个想法,也许有一种方法可以强制 realloc 在每次调用时重新分配分配的内存。我想在单元测试时这样做,以便及早发现此类错误。

是否有这样一个 LD_PRELOAD 库(或类似库)以某种方式挂钩 malloc/realloc/... 调用,从而导致悬空指针提前崩溃?

该库旨在跨平台,但我猜内存错误是 C 中为数不多的可移植事物之一。

【问题讨论】:

  • 您可以在 Stack Overflow 中搜索“interpose”以了解执行您请求的方法,尽管其他工具(例如 valgrind)可能在不同的方面更有用或有用。
  • 如果您使用的是gcc,请查看--wrap 选项(请参阅here)。这将让您定义自己的wrap_realloc(),当任何代码调用realloc() 时,链接器都会调用它。
  • 没有办法强制重定位,但是您可以将realloc定义为一个自定义函数,分配一个新区域然后复制数据。仅在调试编译打开时启用此功能,以避免生产版本的开销。
  • 您的图书馆有多大?在哪个操作系统上?它是多线程的吗?数据有多大,测试...?是免费软件吗?它究竟是做什么的?请编辑您的问题以提供更多详细信息。

标签: c unit-testing realloc


【解决方案1】:

您可以使用valgrind(至少在 Linux 上)来(有时)检测悬空指针和内存泄漏。您最好使用调试信息进行编译(在实践中,所有警告使用gcc -Wall -Wextra -g 并使用GCC 调试信息)。

您也可以使用address sanitizer。所以也使用-fsanitize=addressinstrumentation option。您可能想使用其他消毒剂,也许是-fsanitize=undefined 和/或-fsanitize=leak ...

最后,您可以重新定义自己的realloc(高于普通的mallocfree),或者更仔细地拥有一些myrealloc 函数,该函数总是重新分配和移动内存。

您甚至可以改进您的代码,在几个数据结构或类型中(或之后)添加一些 sentinel values 或一些 magic number

您可能会阅读有关garbage collection 技术的更多信息(例如使用GC handbook)。它们提供有用的见解、概念和术语。并且Boehm's GC 也可以用作内存调试器。

【讨论】:

    【解决方案2】:

    这不是您想要的,但我敢打赌Electric Fence 会解决您的问题。

    它是一个 malloc 调试器,通过将分配空间之后和之前的内存页面标记为不可读/可写来工作。一旦任何指令尝试访问它们,就会发生分段错误。这通常发生在离问题很明显的地方很远的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多