失败的malloc()的单元测试

Pil*_*lsy 8 c unit-testing memory-management libc

单元测试涉及失败的代码路径的最佳方法是什么malloc()?在大多数情况下,它可能并不重要,因为你正在做类似的事情

thingy *my_thingy = malloc(sizeof(thingy));
if (my_thingy == NULL) {
  fprintf(stderr, "We're so screwed!\n");
  exit(EXIT_FAILURE);
} 
Run Code Online (Sandbox Code Playgroud)

但在某些情况下,除了死亡之外你还有其他选择,因为你已经为缓存或其他任何东西分配了一些额外的东西,你可以收回那些记忆.

但是,在那些您可以尝试从失败malloc()中恢复的情况下,您在代码路径中执行的操作非常棘手并且容易出错,这使得测试变得尤为重要.你是怎么做到这一点的?

Ant*_*ima 16

我看到S. Paavolainen向我提出了这个问题的一个很酷的解决方案.我们的想法是malloc()通过自定义分配器来覆盖您可以在链接器中执行的标准

  1. 读取线程调用的当前执行堆栈 malloc()
  2. 检查堆栈是否存在于存储在硬盘上的数据库中
    1. 如果堆栈不存在,则将堆栈添加到数据库并返回 NULL
    2. 如果堆栈确实存在,则正常分配内存并返回

然后,您只需多次运行单元测试:该系统通过不同的控制路径自动枚举malloc()故障,并且比例如随机测试更有效和可靠.

  • +1 表示完全覆盖随机测试。SQLite 执行与此类似的操作 http://www.sqlite.org/malloc.html#testing。malloc() 失败是使用计数器触发的,而不是检查堆栈的唯一性。 (2认同)