【问题标题】:Checking if the correct array length was malloced in C检查正确的数组长度是否是 C 中的 malloc
【发布时间】:2011-09-30 20:42:06
【问题描述】:

我正在为一堆学生作业评分。

他们正在设计自己的动态数组数据类型。我正在寻找一种测试的好方法,以确保它们在重新调整大小时为数组分配正确的内存量。

除了检查代码之外,还有其他方法可以轻松测试 malloc 调用创建的内存量吗?他们应该跟踪容量,但我需要测试他们这样做是否正确。

如果测试没有以段错误结束,如果他们没有分配足够的内存以便我可以继续运行其他测试,我也希望它。

谢谢!

【问题讨论】:

  • 提供您自己的malloc 实现并让他们链接到那个?或者通过 valgrind 运行他们的代码?
  • 我不确定你在问什么。你想在每个学生的作业中加入一行代码,以便检查它是否被正确地 malloc'd 吗?
  • 我正在编写一个程序,该程序将从他们的库中调用函数并将其与已知的正确实现进行比较。以这种方式测试数组的内容很容易,但我不确定如何实际测试内存分配方面。

标签: c arrays size malloc


【解决方案1】:

您可以通过重新定义标准函数名称来为您的测试提供自己的 malloc()calloc()realloc()free() 版本。

使用 gcc,我会创建一个带有替换函数的目标文件

gcc -c myfunctions.c -omyfunctions.o

并使用重新定义编译测试文件并链接到替换

gcc myfunctions.o -Dmalloc=mymalloc -Dcalloc=mycalloc -Drealloc=myrealloc -Dfree=myfree testfile.c

而不是学生使用的东西

gcc testfile.c

my*() 函数的实现应该不会太难。基本上他们检查参数并调用原始函数。

/* myfunctions.c */
#include <stdlib.h>
void *mymalloc(size_t s) {
    /* test s */
    return malloc(s);
}
void *mycalloc(size_t n, size_t s) {
    /* test n and s */
    return calloc(n, s);
}
void *myrealloc(void *p, size_t s) {
    /* test p and s */
    return realloc(p, s);
}
void myfree(void *p) {
    /* test p */
    free(p);
}

【讨论】:

  • 最简单的方法,如果学生设法编写阻止此工作的代码,他们可能做错了什么。除了有争议的例外,他们调用自己的某些函数mymalloc 是合理的,所以可能会在名称中粘贴一个伪随机字符串,或者使用像__mymalloc 这样的保留名称,你恰好碰巧知道你的实现没有任何用途。
  • 显然必须先定义宏,然后再取消定义:如果没有 -U 选项,我无法正确编译测试
  • 哦,没想到。在心理上,我想我还是单独编译了myfunctions.c,而不是每个学生一次。
  • 通过进一步的测试,我无法通过一次编译来管理所有这些:再次编辑答案
  • 但是...这些包装器如何知道 应该 的大小?在我看来,这是棘手的部分(或者我错过了什么?)。
【解决方案2】:

我认为您所期望的问题应该通过在 Valgrind 中运行学生的程序来解决。无论如何,这是一个好主意,因为它也可能会捕获其他不需要的问题,例如越界访问。

【讨论】:

  • +1:恕我直言,这是正确答案。与其尝试包装 malloc 以预期特定的输入条件,不如简单地使用现有工具来确认没有发生非法内存访问。
  • @Oli: tbh 我认为要彻底你应该模拟malloc 使用valgrind。 valgrind 会遗漏一些错误,但 mock 可以测试,例如学生总是使用相同大小的缓冲区,而该缓冲区恰好对于所有测试用例来说都足够大 :-)
猜你喜欢
  • 1970-01-01
  • 2016-07-03
  • 2016-12-04
  • 2013-01-26
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2019-09-05
  • 2018-05-28
相关资源
最近更新 更多