强制使用C ++ 17枚举无效值

时间:2018-08-17 08:42:19

标签: c++ enums c++17

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

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

enum Foo {
    Foo_A,
    Foo_B,
    Foo_C,
    Foo_D
}

根据C ++ 17标准,我们可以将static_cast的值设为0-3,任何其他值都将调用未定义的行为。

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

如何避免UB并仍然测试可能的无效枚举值?

注意:对于某些枚举,我们可以使用固定的基础类型,但是我们不能控制所有事情。我们使用的其他组件提供了一些枚举,并且很难对每个组件进行更改。很少有鼻恶魔更容易对付。

1 个答案:

答案 0 :(得分:2)

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

相反,您需要进行手动检查,以确保在投射前的值是>=Foo_A<= Foo_D