使用assert处理错误检查

时间:2015-12-28 00:44:01

标签: c malloc assert

我看了一遍,似乎有很多关于断言的混合观点。例如,如果我指示了一个指针,并想确保它已被正确分配,那我就写道:

p = malloc(sizeof(int));
assert(p)

而不是:

p = malloc(sizeof(int));
if (p == NULL)
{
... send error message
}

我知道断言它会终止程序,但出于测试目的 - 我想知道的是绝对最安全的方式:

  1. 正在测试malloc正确完成的事情。
  2. 如果某些事情没有malloc正确处理错误。

2 个答案:

答案 0 :(得分:2)

召回assert()通常仅在 debug 版本的程序中处于活动状态,而不是发布版本。

将潜在错误分类:

1)必须处理的运行时错误 assert()在这里并不好,而代码必须处理错误。

2)应该处理的运行时错误尚未定义补救措施 assert()在这里也不明智。代码应发出信号(保留错误信息)并退出。

3)运行时错误,没有简单的重新处理它们 assert() 可以在这里使用。现在当程序出现故障/死亡/挂起时,我们什么都没有。如果可能的话,建议代码应该在#2中发出信号。

4)编译时间错误 assert(sizeof(int)*CHAR_BIT >= 32)是一个很好的示例用法。假设构建将在调试模式下发生是合理的。即使这会带来部署源代码的风险,该字段中的用户可能会跳过调试版本,因此建议仅使用assert()作为内部代码。

assert()是C工具箱中的工具。它有其用途和误用。

使用malloc(),我参与了许多禁止直接使用C lib malloc()的项目,而是使用了my_malloc_never_fail()my_malloc_may_fail()这样的项目特定代码处理和指标。正如@Weather Vane评论的那样,良好的错误处理具有挑战性。

答案 1 :(得分:1)

  1. 测试失败:
    如果无法向程序提供所请求的内存量,则C标准需要malloc函数返回NULL。

    这意味着如果malloc的返回值为非NULL,则可以确保已正确分配内存的 ALL

    检查NULL返回值是确定malloc是否成功的唯一方法。如果断言失败,assert函数可用于停止程序,但在程序的生产版本中, 必须有其他错误处理。

  2. 处理失败:
    如果返回值为NULL,请使用errno变量确定故障发生的原因。 errno变量也是C标准的一部分。

    对于LINUX,这里的值errno列表可以设置为:

    http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Errors/unix_system_errors.html

  3. 重要:malloc失败是一个严重的错误。如果发生这种情况 程序执行,不要尝试继续执行其他操作 程序中的功能。 一旦记录错误,就立即停止(退出)程序 报告给该计划的用户,如下:

    您应该使用exit函数并且非零返回 值通知用户程序退出的程序 有错误状态。 exit函数也是 C语言标准的一部分。

    此外,在退出程序之前,请确保所有其他内存 被分配(在malloc失败之前)被正确地解除分配。