我们使用VS 2008
有一个很大的枚举,由许多开发人员填充
这个枚举有一个类型__int64(一个Microsoft扩展名),我想让编译器抱怨枚举中的非唯一值。
如果它是通常的枚举,我会这样做:
enum E1
{
E11 = 0x01F00,
E12 = 0x01F00,
E13
};
#pragma warning(push)
#pragma warning(error: 4061)
#pragma warning(error: 4062)
void F(E1 e1)
{
switch (e1)
{
case E11:
case E12:
case E13:
return;
}
}
#pragma warning(pop)
如果E1有2个相同的值
,则函数F会出错如果开发人员忘记为切换添加新值
,则会出现另一个错误但我的枚举类型为__int64(或很长)
当我尝试为E1 e1执行相同的切换时,它会截断值并对值进行抱怨,其差异为0x100000000或0x200000000 ....
如果我将e1转换为__int64,编译器不会抱怨,如果开发人员忘记向交换机添加新值(因此整个检查功能变得无用)
问题:有人知道我能做些什么吗?或者VS 2008(或C ++)有另一种工具来确保枚举:__ int64只有唯一值?
答案 0 :(得分:2)
从你的评论我会假设你在枚举本身中没有聚合(组合)标志。在这种情况下,您可以使用两个枚举来使错误更加困难。你仍然可以颠覆编译器,但我认为这不是真正的问题。
enum Bit_Index
{
FLAG1_INDEX,
FLAG2_INDEX,
FLAG_FANCY_INDEX,
LAST_INDEX
};
#define DECLARE_BIT_VALUE(att) att##_VALUE = 1ULL << att##_INDEX
enum Bit_Value
{
DECLARE_BIT_VALUE(FLAG1),
DECLARE_BIT_VALUE(FLAG2),
DECLARE_BIT_VALUE(FLAG_FANCY),
// Declared NOT using the macro so we can static assert that we didn't forget
// to add new values to this enum.
LAST_BIT // Mainly a placeholder to prevent constantly having to add new commas with new ids.
};
#undef DECLARE_BIT_VALUE
然后在实现文件中使用static_assert确保枚举不会错位:
// Make sure to the best of our abilities that we didn't mismatch the index/bit enums.
BOOST_STATIC_ASSERT((LAST_BIT - 1) == (1U << (LAST_INDEX - 1)));
答案 1 :(得分:0)
有人知道我能做些什么。
其他答案可以是算法分析。静态分析不一定是对安全漏洞的搜索。不幸的是,在这种情况下,您将不得不使用外部工具来验证约束。我可以帮你实现这个目标。