Комментарии 7
Фрагмент N3
// yet is effectively a NO-OP. As the compiler isn't smart enough
ну строго говоря коммент всё сказал по 3ему фрагменту: ни один из этих вызовов не будет сделан, то есть код там unreachable.
Получаем счетчик UB 42 :) что гораздо лучше, чем 48. Ровнее!
Забавно что если в программе хоть где-то есть UB, то вся программа UB. А поскольку здесь речь идёт о компиляторе, то транзитивно все бинарники, собранные с помощью LLVM, тоже становятся UB. Повторив те же умозаключения для других компиляторов, можем прийти к выводу что программ на C++ без UB в мире вообще не существует :)
Я не могу этого формально доказать, но что то мне подсказывает, что нет вообще ни одной не тривиальной программы на любом языке без УБ. Обоснование простое - в стэке любого языка (компилятор, рантайм, утилиты) есть хотя бы одна программа собранная гцц/шланг/мсвц которые с УБ -> транзитивно, согласно вашей же логике, и все другие программы тоже содержат УБ. Это я к тому что УБ УБ рознь и на практике они не все одинаково страшные.
Существует такая теория заговора: компилятор может вставлять скрытый код в программы. Этот код нельзя посмотреть в бинарниках, ведь программы для просмотра бинарников тоже скомпилированы этим компилятором. А если компилируете другим компилятором, то это всё равно не поможет, ведь бинарники другого компилятора тоже содержат этот скрытый код и добавляют его в новые программы.
А можно ли к UB в компиляторе относиться также, как к UB в пользовательском коде? Ведь по сути, UB это возможность для имплементаторов компилятора сделать что-то оптимальнее, а при реализации компилятора, авторы сами понимают, что здесь будет происходить
К примеру, в коде STL MSVS можно найти пример, как в конце объекта размещают union { T obj; }, чтобы гарантировать выравнивание и возможность взять адрес, а затем создают по этому адресу целый массив. В пользовательском коде такое действие привело бы к разрушению объекта, в котором содержится union
Сколько UB в моём компиляторе?