【问题标题】:Force Calloc to return Null for unit testing强制 Calloc 返回 Null 进行单元测试
【发布时间】:2016-06-29 08:50:13
【问题描述】:

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

【问题讨论】:

  • @JazzCat 您能否更具体地说明问题中给您带来麻烦的部分?我发现它合乎逻辑且易于理解。
  • 将第二个参数作为0 传递给calloc。它将返回NULL。
  • @hacks 那是实现定义的

标签: c


【解决方案1】:

你可以问calloc() 有非常大的内存,可能比你的系统所能提供的还要大。

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

【讨论】:

  • 如果对象要检查调用函数的行为是否正常,则另一种方法是修补返回 NULL 的替代函数。
  • 你的第一句话很有趣,但确实回答了问题:)
  • 有趣。我正要写“你可以分配比你想象的更多的内存”(参见scvalex.net/posts/6 等),但对于可能触及每一页的 calloc 来说,情况可能并非如此。
  • @hacks, :D 简单的解决方案有时很有趣。
  • @hacks :不过话说回来,this strategy may not work。哦等等,Peter A. Schneider 提到它需要归零。 ......好点,实际上。那我就不知道了。
【解决方案2】:

如果您无法更改分配的内存量(因为这意味着更改被测代码),您当然可以替换自己的calloc()。只需实现一个返回 NULL 并确保相应的目标文件出现在链接命令中。如果我没记错的话,链接器只会链接到标准库中尚未解决的符号。 (我才看到这是风向标从cmets那里得到的建议。)

如果要测试的代码中的内存分配比程序在其他地方使用的内存大,您可以通过人为限制程序允许的内存使用量来测试它,可能是calling ulimit in the calling shell with appropriate parameters.

【讨论】:

  • 重新编辑:替代函数可以通过调用适当的函数并跟踪分配的内存量来控制它。
  • @WeatherVane 您的意思是,如果我们知道代码尝试分配的确切字节数,并且在该特定数量上失败?或者可能是第 n 个电话......我想链接会变得更加复杂。好吧,在编译被测代码时,可能可以通过编译器提交的define 更改函数名称。
  • 嗯,是的(以及其他类型的malloc)。假设正在分配一个二维动态数组。当 UUT 在操作的中途耗尽内存时,它必须表现良好。对于许多应用程序来说,举起手来打电话给exit() 不是一种选择。
【解决方案3】:

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

然后在你的单元测试中包装对calloc()的调用,例如:

#ifdef CALLOC
...your calloc function
#endif

然后用-DCALLOC 编译,让单元测试使用你的calloc()

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

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

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

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

【讨论】:

    【解决方案4】:

    最简单的方法:

    #define calloc(what, ever) NULL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-27
      • 2020-06-14
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2020-07-20
      相关资源
      最近更新 更多