MSV C C / C ++ компилятор предупреждение о неопределенном поведении - PullRequest
0 голосов
/ 29 января 2020

Я скомпилировал простой код UB без каких-либо предупреждений или ошибок, используя Visual Studio 2019:

int main()
{
    int i = 10;
    i = i++ + ++i;
    return i;
}

Я включил EnableAllWarnings (/ Wall) и воспринимаю предупреждения как флаги ошибок (/ WX). Он скомпилирован в:

mov         eax,17h  
ret  

Поскольку компилятор сгенерировал этот код, я уверен, что он обнаружил UB. Почему MSV C не генерирует никаких предупреждений о UB?

Я проверил, что Clang и G CC выдают предупреждения для этого примера. Они генерируют предупреждения для любого возможного UB? Если так, то почему MSV C нет?

Ответы [ 2 ]

3 голосов
/ 29 января 2020

Clang и G CC выдают предупреждения для этого примера. Они генерируют предупреждения для любого возможного UB?

Нет. Многие вещи определены как «неопределенное поведение» вместо того, чтобы требовать диагностики c, именно потому, что их чрезвычайно трудно (или даже теоретически доказано, что это невозможно) обнаружить со 100% точностью.

0 голосов
/ 29 января 2020

Предположим, что код был *p = (*q)++ + ++(*r); В этом случае компилятор, как правило, не может знать, что, если какие-либо комбинации указателей идентифицируют одни и те же объекты. Хотя было бы просто заставить компилятор выдавать диагностику c в таких простых фрагментах кода, как ваша, вероятность того, что кто-нибудь случайно сможет написать такой код, была бы довольно отдаленной по сравнению с вероятностью сбоя при разделении операций на указатели, которые происходят, чтобы идентифицировать одни и те же объекты. Компилятор не собирается выдавать диагностику c для конструкции, если только автор или сопровождающий не напишет код для этого. Хотя авторы некоторых компиляторов тратят много усилий, включая такую ​​диагностику, многие другие считают, что любое время и усилия, которые им придется потратить, включая такую ​​диагностику, лучше потратить на поддержку других, более полезных функций.

...