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中的家伙搞砸了。我想我会保留我在那里提交的问题。谢谢。