Type Sanitizer: способ обнаружения нарушений правил strict aliasing в C++
Одними из наиболее неочевидных и трудноуловимых правил стандарта языка С++ являются правила strict aliasing, которые создают множество проблем (например, таких как «каламбур типов» (type punning)). Из-за этого многие приложения собираются с опцией -fno-strict-aliasing
, которая запрещает компилятору полагаться на использование этих правил. В свою очередь, это ведет к снижению производительности программ, т. к. компиляторные оптимизации, полагающиеся на анализ типов, не могут в полной мере произвести оптимизацию кода. Вместо этого было бы полезно иметь способ обнаружения нарушений strict aliasing-правил, который бы позволил избежать использования опции -fno-strict-aliasing
при сборке программы.
В данном докладе обсуждается способ динамического анализа приложений, который позволит обнаружить нарушения strict aliasing-правил, не замеченных компилятором. Данный доклад нацелен по большей части на компиляторную аудиторию, т. к. затрагивает детали реализации внутренностей LLVM.