Правильно ли MSVC когда-нибудь поддерживал битовые поля на основе перечислений? - PullRequest
0 голосов
/ 23 сентября 2019

Когда я впервые опубликовал этот связанный вопрос Я подумал, что столкнулся с каким-то странным крайним случаем, который, возможно, содержал неопределенное поведение.Однако, если вы прочитаете самое последнее обновление там, вы увидите, что гораздо более простой пример также не работает. Протестируйте пример здесь .

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

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

Компилятор предупреждает нас, что здесь что-то не так:

предупреждение C4789: буфер '' размера 8байты будут переполнены;8 байтов будут записаны, начиная со смещения 4

struct S равно 8 байтов, как правильно вычислил компилятор.Однако, пытаясь создать экземпляр этой структуры, он в итоге записывает 12 байтов.Этот конкретный пример также демонстрирует проблему без включенной оптимизации, в отличие от оригинала в связанном вопросе.

Все компиляторы VC ++ в Compiler Explorer демонстрируют это неправильное генерирование кода, хотя об этом предупреждают только более свежие.Я задаю этот отдельный вопрос, чтобы узнать, существовала ли эта проблема всегда, или это несколько недавний регресс.Если это всегда было там, то, должно быть, было чистой удачей, что битовые поля работали так долго.Таким образом, чтобы было ясно, что VS 2017 и VS 2019, как известно, затронуты, но у меня не установлены более ранние версии.Если бы кто-то еще мог проверить их и написать результаты здесь и / или объяснить, почему эта проблема возникает с компиляторами VC ++, а не с GCC / Clang, это было бы очень полезно.

Надеюсь, это не то местопросить об этом.

...