【发布时间】:2018-08-31 14:47:10
【问题描述】:
This library 使用assert() 就好像它是发布模式下的标识函数(当定义了 NDEBUG 时)。问题是一些重要的代码是用assert() 包裹的,我的测试在发布模式下执行时触发了,因为这些重要的部分没有被调用。可以在here 找到一个这样的示例,其中随机字节生成器不会生成任何内容,并且会导致无限循环。
个人轶事:我不喜欢assert(),由于这些歧义问题,我个人不使用它。我听说很多项目都因此出现了严重的错误,最近是 EOS,当他们的单元测试没有检测到一些超出范围的数组时,因为 NDEBUG 是在发布模式下定义的并且它没有触发。在这一点上,文档似乎并不清楚。 assert() 是否完全充当身份?
这个库(libbtc)似乎被广泛使用,我不明白开发人员为什么这样做。这是一个可怕的错误,我应该分叉并删除所有这些断言吗?或者这是一些与 C++ 不兼容的 C 东西?有人可以在这里解释正确的行动方案吗?
我使用 clang 6。
【问题讨论】:
-
assert用于检查永远不可能发生的情况实际上永远不会发生。它发现编程错误。如果断言在运行时可能由于用户输入或其他外部因素而失败,那么它一开始就不应该是断言。 -
没有歧义;您描述的代码完全是错误的。
-
“由于这些歧义问题,我个人不使用它” - 使用 assert 通常是团队的选择。我知道不止一个团队同意发布带有断言启用的代码。在至少一个系统上,断言成为“看门狗”设计的一部分。在一项系统审查中,有 3000 多个断言,有
-
请注意,在 release 中运行的断言(并始终返回其值)通常称为
verify。所以if (verify(some_test())){是一个分支,如果失败则断言。
标签: c++ unit-testing c++11 assert