Я работаю с 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. Кто-нибудь знает об истории?