c++ - 强制使用 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 并仍然测试可能的无效枚举值?
注意:我们可以对某些枚举使用固定的底层类型,但我们不能控制所有内容。一些枚举是由我们使用的其他组件提供的,强制更改每个组件将相当困难。很少有鼻恶魔可能更容易对付。
解决方案
这里的问题是“未定义行为”的范围包括“没有任何明显异常的工作”。您无法测试是否发生了未定义的行为。
相反,您需要手动检查强制转换前>=Foo_A
的值是否为<= Foo_D
推荐阅读
- eclipse - 将 Xtext 项目导出到应用程序/可运行
- css - 伪元素在大屏幕和超大屏幕上太小
- python - 如何在漂亮的汤对象中打印两个短语之间的所有行?
- reactjs - 安装 MongoDB 后 Npm React 脚本无法正常工作
- android - 如何指示应用模块覆盖依赖模块中的资源?
- r - 如何从 R 导出多个数据框列表
- oracle - Oracle APEX 更新详细交互式网格中的主列
- laravel - Laravel Mix vue not working and not found css
- c++ - 如何将最新的 Windows SDK 版本传递给 CMake?
- c# - 部分类中的命名空间