首页 > 解决方案 > 强制使用 C++17 枚举无效值

问题描述

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

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

enum Foo {
    Foo_A,
    Foo_B,
    Foo_C,
    Foo_D
}

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

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

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

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

标签: c++enumsc++17

解决方案


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

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


推荐阅读