【发布时间】: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。