c++ - 使用static_cast创建的枚举调用C++函数的安全性

标签 c++ enums

我一直在对函数输入参数使用枚举,但是我注意到这可能非常危险。
例如:

enum class MYENUM {
    X1 = 0, X2
};

std::map<MYENUM, int> mymap;
//init mymap here with known enum values of X1 and X2


int MyFunc(const MYENUM& input) {
    return mymap.at(input);
}

int main() {
    MyFunc(static_cast<MYENUM>(10000));
}
因此10000不是有效的enum值。您将如何亲自找到解决方案?您是否将map访问权限包含在try块中,并catch将该exception括起来?如果我有许多函数可以使用用户输入的枚举值访问容器信息,该怎么办-然后您也将try catch放在所有这些函数中吗?

最佳答案

How would you personally find a solution to this?


简单。引入类枚举的原因之一是类型安全-他们不会自动接受任何值。所以,你这里的代码
MyFunc(static_cast<MYENUM>(10000));
只是绕过了语言提供的安全性。解决方案很简单-请勿通过强制转换来避免安全性,并且编译器将不允许您使用错误的值。
如果有人使用 Actor 表-这不是您的问题。有人可以通过多种方式绕过内置类型的安全性并为功能提供完全虚假的值。图书馆作家对此无能为力。

关于c++ - 使用static_cast创建的枚举调用C++函数的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63490783/

相关文章:

c++ - 如何从依赖文件(.d)中消除某些(非系统) header ?

c++ - 强制派生类而不再次实现纯虚拟

java - 映射值应该声明为常量还是枚举?

c++ - 在 C++ 中处理多维数组长度

c++ - 使用 LoadImage() 中的 GetObjet() 后,BITMAP 结构中的 bmBit 始终为 NULL

javascript - 将 RGB 颜色值转换为十进制

swift - 为什么具有可选关联值的 Swift 枚举在声明时需要尾随括号?

c# - 在 C# 中,我应该使用 Enum、static Class、Dictionary 还是 Struct 来表示这些 "labeled floats"?

Java Spring 无法创建使用枚举作为构造函数参数的 Bean

typescript 枚举作为参数类型允许无效值