Краткое объяснение того, что компилятор не выдает предупреждение в таких случаях, состоит в том, что это не требуется.
В определении «неопределенный» в стандарте также прямо говорится «не требуется никакой диагностики». Это означает, что стандарт не требует реализации для выдачи диагностики в таких случаях. Причиной этого является то, что технически компиляторы могут быть не в состоянии обнаружить все случаи неопределенного поведения в течение разумного времени или (в некоторых случаях) вообще. Некоторые случаи могут быть обнаружены только во время выполнения. Компиляторы являются сложными частями кода, поэтому, даже если человек может легко распознать проблему, компилятор не может (с другой стороны, компиляторы также обнаруживают проблемы, которые люди не могут легко найти).
Когда диагностика не требуется, есть несколько вещей - все на усмотрение - это должно произойти до того, как компилятор выдаст предупреждение.
Первое, что происходит, касается проблемы "качества реализации" - разработчик поставщика или компилятора решает написать код, который обнаруживает конкретные случаи, и другой код, который выдает предупреждение
Два шага (обнаружение случая и предупреждение о нем) являются отдельными и полностью дискреционными - стандарт не требует диагностики, поэтому даже если написан код, который обнаруживает конкретный случай, компилятору по-прежнему не требуется выдавать предупреждение об этом. Практически, даже если проблемы обнаружены, разработчики компилятора могут решить не выдавать предупреждение по различным причинам. Некоторые предупреждения касаются редких крайних случаев, поэтому не стоит прилагать усилия для их выдачи. Некоторые предупреждения имеют частоту «ложных срабатываний», что приводит к тому, что разработчики жалуются на сообщения об ошибках поставщику компилятора о ненужных предупреждениях - поэтому компилятор по умолчанию настроен так, чтобы они не излучали.
Следующим требованием для выдачи предупреждения является то, что пользователь компилятора должен выбрать отображение предупреждений. Благодаря активному лоббированию поставщиков разработчиками - большинство современных компиляторов настроены ПО УМОЛЧАНИЮ, поэтому они выдают только относительно небольшое количество предупреждений. Таким образом, разработчики, которые хотят получить как можно больше помощи от компилятора, должны явно включить его. Например, используя опции -Wall
с gcc и clang.