强制Calloc为单元测试返回Null

强制Calloc为单元测试返回Null,c,C,我有一个代码,我必须为它编写一个单元测试。语句中有一个calloc()。我必须验证calloc()返回Null的假条件。我确信我将始终拥有所需的可用内存。有没有办法让calloc()返回null?您可以要求calloc()使用非常大的内存,可能比您的系统所能提供的内存大 如果它仍然没有返回NULL,则重复几次。您将得到您想要的。如果您无法更改分配的内存量(因为这意味着更改测试中的代码),您当然可以替换您自己的calloc()。只需实现一个返回NULL的函数,并确保相应的对象文件出现在link命令

我有一个代码,我必须为它编写一个单元测试。语句中有一个
calloc()
。我必须验证
calloc()
返回Null的假条件。我确信我将始终拥有所需的可用内存。有没有办法让
calloc()
返回null?

您可以要求
calloc()
使用非常大的内存,可能比您的系统所能提供的内存大


如果它仍然没有返回
NULL
,则重复几次。您将得到您想要的。

如果您无法更改分配的内存量(因为这意味着更改测试中的代码),您当然可以替换您自己的
calloc()
。只需实现一个返回NULL的函数,并确保相应的对象文件出现在link命令中。如果我没有弄错的话,链接器只会链接到标准库中的符号,而这些符号在当时是无法解析的。(我只是从评论中看出这是Weather Vane的建议。)

如果要测试的代码中的内存分配比程序在其他地方使用的内存大,您可以通过人为限制程序允许的内存使用量来测试它,可能是通过最简单的方法:

#define calloc(what, ever) NULL

最好的方法是,在单元测试中,编写一个与
calloc()
具有相同签名的函数

然后在单元测试中使用如下内容包装对
calloc()
的调用:

#ifdef CALLOC
...your calloc function
#endif
然后使用
-DCALLOC
进行编译,让单元测试使用您的
calloc()

不带(上述)参数进行编译,使单元测试使用系统版本的
calloc()

然后,当使用您的
calloc()
版本进行测试时,它可以返回NULL以测试故障路径

一般来说,单元测试应该通过脚本来运行,因此可以多次运行特定的单元测试,比如一次使用系统
calloc()
,一次使用
calloc()的“特殊”版本
calloc()


注意:这是在执行单元测试时让系统函数返回特定值的常用方法。

@JazzCat能否更具体地说明问题中导致您遇到麻烦的部分?我发现这很合乎逻辑,也很容易理解。将第二个参数作为
0
传递给
calloc
。它将返回实现定义的
NULL
@haccks另一种方法是插入一个返回
NULL
的替代函数,如果目标是检查调用函数的行为是否正常。您的第一句话很有趣,但确实回答了以下问题:)有趣。我正要写“您可以分配比您想象的更多的内存”(参见或诸如此类),但对于可能涉及到每一页的calloc来说,这可能不是真的。@haccks,:D简单的解决方案有时很有趣。@haccks:但是,再一次。哦,等等,Peter A.Schneider提到它需要调零。。。说得对。那么我不知道。重新编辑:替换函数可以通过调用适当的函数并跟踪分配的内存量来控制它。@WeatherVane你的意思是如果我们知道代码试图分配的确切字节数,但在特定数量下失败了?或者可能是第n个电话。。。我想链接会变得更复杂。在编译测试代码时,可以通过编译器提交的
define
更改函数名。是的(对于其他类型的
malloc
)。假设正在分配一个二维动态数组。当UUT在操作过程中的一段时间内存不足时,它必须表现良好。对于许多应用程序,将手举在空中并调用
exit()
不是一个选项。