首页 > 解决方案 > MSVC 是否曾经正确支持基于枚举的位域?

问题描述

当我第一次发布这个相关问题时,我以为我遇到了一些奇怪的边缘情况,可能包括未定义的行为。但是,如果您阅读那里的最新更新,您会发现一个更简单的示例也不起作用。在此处测试示例

struct S
{
    int a{};
    enum{} b : 1;
    enum{} c : 1;
};

auto test()
{
    return S{}; //Buffer overrun on this line
}

编译器有用地告诉我们它在这里做错了:

警告 C4789:大小为 8 字节的缓冲区“将被溢出;从偏移量 4 开始写入 8 个字节

struct S是 8 个字节,因为编译器已经正确计算出来了。但是,在尝试构造此结构的实例时,它最终总共写入了 12 个字节。与相关问题中的原始示例不同,此特定示例还演示了未启用任何优化的问题。

Compiler Explorer 上的所有 VC++ 编译器都显示了这种错误的代码生成,尽管只有较新的编译器对此发出警告。我问这个单独的问题,以了解这个问题是否一直存在,或者它是否是最近的回归。如果它一直存在,那么位域工作了这么长时间一定是纯粹的运气。所以要明确一点,已知 VS 2017 和 VS 2019 会受到影响,但我没有安装早期版本。如果其他人可以测试这些并在此处编写结果,和/或解释为什么 VC++ 编译器而不是 GCC/Clang 会出现此问题,那将非常有帮助。

我希望这不是要求这个的错误地方。

标签: c++visual-c++compiler-bug

解决方案


推荐阅读