Макс Казанцев
Компания: Сбер
Все знают, что в С++ некоторые конструкции ведут к неопределенному поведению программы (UB). Многие догадываются, что благодаря этому компиляторы могут лучше оптимизировать код. Но немногие знают, как именно компиляторы моделируют работу с неопределенным поведением, и как устроены оптимизации на их основе.
Я расскажу о том, как компиляторы на основе LLVM, такие как Clang, решали проблему представления неопределенного поведения в своем IR. Познакомимся с понятием отложенного UB, из-за которого опасный код не взрывается сразу, и поговорим о том, как LLVM с ним работает. Как было раньше и как стало сейчас, как от этого выигрывает оптимизатор, и какие опасности подстерегают тех, кто недостаточно осторожен с конструкциями, которые могут производить UB.
Компания: Сбер