Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ assert()是否在发布模式中充当标识函数?_C++_Unit Testing_C++11_Assert - Fatal编程技术网

C++ assert()是否在发布模式中充当标识函数?

C++ assert()是否在发布模式中充当标识函数?,c++,unit-testing,c++11,assert,C++,Unit Testing,C++11,Assert,使用assert()。问题是一些重要的代码用assert()包装,我的测试在发布模式下执行时被触发,因为这些重要的部分没有被调用。可以找到这样一个例子,其中随机字节生成器不会生成任何内容,并将导致无限循环 个人轶事:我不喜欢assert(),我个人也不使用它,因为这些模棱两可的问题。我听说很多项目因为它而有严重的bug,最近的EOS,当他们的单元测试没有检测到一些超出范围的数组时,因为NDEBUG是在发布模式下定义的,并且没有触发。在这一点上,文档似乎并不清楚。assert()是否充当标识 这个

使用
assert()。问题是一些重要的代码用
assert()
包装,我的测试在发布模式下执行时被触发,因为这些重要的部分没有被调用。可以找到这样一个例子,其中随机字节生成器不会生成任何内容,并将导致无限循环


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

这个库(libbtc)似乎被广泛使用,我不明白开发人员为什么这样做。这是一个可怕的错误,我应该放弃并删除所有这些断言吗?或者这是不是C++兼容的C语言?有人能在这里解释一下正确的做法吗

我使用clang 6。

来自:

如果在源代码中包含
的地方将
NDEBUG
定义为宏名称,则assert不执行任何操作

不要在
assert
中放入任何有副作用的内容。当您编译以供发布时,它们不会发生,并且会改变程序的行为。

来自:

如果在源代码中包含
的地方将
NDEBUG
定义为宏名称,则assert不执行任何操作


不要在
assert
中放入任何有副作用的内容。它们不会在编译发布时发生,并且会改变程序的行为。

看起来库编写器误用了assert,并将函数代码放在了不属于它的地方。
至于assert()引起的bug,则是由于对其用途的错误理解或缺乏编程规则。assert()用于验证不变量不会被破坏,而不是用于函数代码。assert()很容易被误用或在错误的地方使用。

看起来像是库编写器误用了assert,并将函数代码放在了它不属于的地方。
至于assert()引起的bug,则是由于对其用途的错误理解或缺乏编程规则。assert()用于验证不变量不会被破坏,而不是用于函数代码。assert()很容易被误用或在错误的地方使用。

assert
用于检查不可能发生的情况实际上永远不会发生。它会发现编程错误。如果一个断言在运行时由于用户输入或其他外部因素而失败,那么它本来就不应该是一个断言;您描述的代码完全是错误的。“我个人不使用它,因为存在这些模糊性问题”-使用assert通常是团队的选择。我知道不止一个团队同意在启用断言的情况下发布发布代码。至少在一个系统上,这些主张成为“看门狗”设计的一部分。在一次系统审查中,3000多个资产中,有<20个无用(无害)资产,没有一个被视为问题(他们遵守规则)。我似乎记得关于资产有5条左右的规则。有什么需要研究的吗?请注意,在发行版中运行的断言(总是返回其值)通常称为
verify
。所以
if(验证(一些测试()){
是一个分支,当它失败时会断言。
断言
用于检查不可能发生的情况实际上从未发生过。它会发现编程错误。如果断言在运行时由于用户输入或其他外部因素而失败,那么它本来就不应该是断言。没有歧义;cod您所描述的e完全是错误的。“我个人不使用它,因为这些模糊性问题”-assert的使用通常是团队的选择。我知道不止一个团队同意在启用Assets的情况下发布发布代码。在至少一个系统上,Assets成为“看门狗”的一部分设计。在一次系统审查中,3000多个断言中,有<20个无用(无害)的断言,没有一个被认为是问题(它们遵循规则)。我似乎记得有5个左右关于断言的规则。有什么需要研究的吗?请注意,在发布中运行的断言(总是返回其值)通常被称为
verify
。所以
if(verify(some_test()){
是一个分支,如果失败就会断言。所以github中的家伙搞砸了。我想我会保留我在那里提交的问题。谢谢。所以github中的家伙搞砸了。我想我会保留我在那里提交的问题。谢谢。