История старой ошибки оптимизации MSVC (VS 2013) для битового поля в X64? - PullRequest
0 голосов
/ 19 сентября 2019

Я работаю с VS 2013 для старой базы кода и обнаружил следующую ошибку оптимизации компилятора.

Это простой код C, использующий битовое поле.

typedef struct {
    int a:1;
    int b:31;
    int c;
} X;

void test(X *pX)
{
    if (pX) { pX->a = 0; pX->b = 0; }
}

И этоявляется разборкой двоичного файла, скомпилированного с параметрами режима выпуска по умолчанию ("/ O2").

mov         eax,dword ptr [rcx]  
xor         edx,edx  
test        rcx,rcx  
cmovne      eax,edx  
mov         dword ptr [rcx],eax  

Как видите, если pX (rcx) равен NULL, это вызывает недопустимое исключение доступа к памяти.К счастью, я подтвердил, что VS2015 или новее генерирует правильные коды.(Но я шокирован и рассматриваю другие старые проекты.)

Я не могу найти ни одного связанного с ним на https://developercommunity.visualstudio.com. Кто-нибудь знает об истории?

...