Стандарт очень четко указывает, что большинство форм неопределенного поведения "не требует диагностики".Это означает, что ваш компилятор не обязан диагностировать UB (что также было бы неразумно, поскольку во многих случаях это очень трудно ).Вместо этого компилятору разрешено просто предполагать , что вы "конечно" не писали UB и генерировать код, как если бы вы этого не делали.И если вы сделали , это на вас, и вы сможете сохранить обломки.
Некоторые инструменты (например, asan
и ubsan
и повышение уровня предупреждения компиляторов до 11)обнаружить некоторые UB для вас.Но не все.
Ваши разработчики компилятора не собираются вредить вам.Они делают пытаются предупредить вас о UB, когда могут.Таким образом, по крайней мере, вы должны включить все предупреждения и позволить им помочь вам как можно лучше.
Один из способов обнаружить UB - это иметь интимное знание стандарта C ++ и читать код очень осторожно .Но вы не можете добиться большего успеха, чем это. Позвольте некоторым инструментам помочь вам найти низко висящие фрукты.Вы просто имеете чтобы знать ( all ) правила и знать, что вы делаете.
В C ++ нет тренировочных колес или подобных им предметов.