3

我们使用 VS 2008

有一个很大的枚举,由许多开发人员填充

这个枚举有一个类型 __int64 (微软扩展),我想让编译器抱怨枚举中的非唯一值。

如果这是一个通常的枚举,我会这样做:

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 (或 long long)

当我尝试为 E1 e1 执行相同的开关时,它会截断值并抱怨值,差异是 0x100000000 或 0x200000000 ....

如果我将 e1 转换为 __int64,编译器不会抱怨,如果开发人员忘记向开关添加新值(因此整个检查功能变得无用)

问题:有人知道我能做些什么吗?或者也许VS 2008(或C++)有另一种工具来确保枚举:__int64 只有唯一值?

4

2 回答 2

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)));
于 2012-06-29T14:47:59.740 回答
0

有人知道我能做些什么吗。

其他答案可以是算法分析。静态分析不一定是寻找安全漏洞。不幸的是,在这种情况下,您将不得不使用外部工具来验证您的约束。我可以帮助你实现这一点。

于 2012-06-29T22:32:35.483 回答