在我们的项目中,枚举通常用于与其他组件进行通信。这是旧代码,因此通常使用非固定类型的C ++无作用域枚举。
出于UT的目的,我们想测试一下这种情况,当我们收到无效的enum值时(它来自不同的组件,因此不能100%正确)。当枚举具有一些“空”值时,一切都很好,这些值不使用但仍在有效范围内。但是让我们考虑以下枚举:
enum Foo {
Foo_A,
Foo_B,
Foo_C,
Foo_D
}
根据C ++ 17标准,我们可以将static_cast
的值设为0-3,任何其他值都将调用未定义的行为。
如果我们需要从有效范围之外传递值怎么办?我想检查我的函数在传递值时是否正确反应(返回错误),例如4
。
如何避免UB并仍然测试可能的无效枚举值?
注意:对于某些枚举,我们可以使用固定的基础类型,但是我们不能控制所有事情。我们使用的其他组件提供了一些枚举,并且很难对每个组件进行更改。很少有鼻恶魔更容易对付。
答案 0 :(得分:2)
这里的问题是“未定义行为”的范围包括“没有任何明显异常的作品”。您无法测试是否发生未定义行为。
相反,您需要进行手动检查,以确保在投射前的值是>=Foo_A
和<= Foo_D