assert()在发布模式下是否充当身份功能?

The*_*ist 1 c++ unit-testing assert c++11

该库使用assert()好像它是发布模式下的标识函数(当定义了NDEBUG时).问题是一些重要的代码被包装assert(),并且在发布模式下执行时我的测试被触发,因为这些重要的部分没有被调用.这里可以找到一个例子,其中随机字节生成器不会生成任何东西,并将导致无限循环.

个人轶事:我不喜欢assert(),我个人不会因为这些歧义问题而使用它.我听说很多项目都有严重错误,因为它,最近的EOS,当他们的单元测试没有检测到一些超出范围的数组时,因为NDEBUG是在发布模式下定义的并且没有触发.在这一点上,文档似乎并不清楚.是否assert()充当身份?

这个库(libbtc)似乎被广泛使用,我不明白为什么开发人员会这样做.这是一个可怕的错误,我应该分叉并删除所有这些断言?或者这是一些与C++不兼容的C事物?有人可以在这里解释一下正确的行动方案吗?

我用clang 6.

Fra*_*eux 7

来自https://en.cppreference.com/w/cpp/error/assert:

如果NDEBUG在源代码中<cassert>包含的位置定义为宏名称,则assert不执行任何操作.

不要放置任何assert有依赖的副作用的东西.编译发布时不会发生这些问题,并且会改变程序的行为.