【问题标题】:Forcing invalid value to enum with C++17强制使用 C++17 枚举无效值
【发布时间】:2018-08-17 08:42:19
【问题描述】:

在我们的项目中,枚举通常用于与其他组件进行通信。这是旧代码,因此主要使用具有非固定类型的 C++ 无作用域枚举。

出于 UT 的目的,我们想测试这种情况,当我们收到无效的枚举值时(它来自不同的组件,所以我们不能 100% 正确)。一切都很好,当枚举具有一些“空”值时 - 未使用但仍在有效范围内的值。但是让我们考虑以下枚举:

enum Foo {
    Foo_A,
    Foo_B,
    Foo_C,
    Foo_D
}

根据 C++17 标准,我们可以 static_cast 取值 0-3,以及任何其他调用 Undefined Behaviour。

如果我们需要传递超出有效范围的值怎么办?我想检查,如果我的函数在传递值时反应正确(返回错误),例如4.

可以做些什么来避免 UB 并仍然测试可能的无效枚举值?

注意:我们可以为一些枚举使用固定的底层类型,但我们不能控制一切。一些枚举是由我们使用的其他组件提供的,强制更改每个组件将是相当困难的。很少有鼻恶魔可能更容易对付。

【问题讨论】:

  • 可以做些什么来避免 UB 并仍然测试可能的无效枚举值? 找到不同的 Universe?
  • 是否有可能更改函数的签名?如果是的话,你可以让它取一个整数而不是一个枚举并测试而不用担心 UB。从枚举到整数的转换是明确定义的,IIRC。

标签: c++ enums c++17


【解决方案1】:

这里的问题是“未定义行为”的范围包括“没有任何明显异常的工作”。您无法测试是否发生了未定义行为。

相反,您需要手动检查转换前的值是否为>=Foo_A 和<= Foo_D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多