Les pointeurs sont compliqués II : Bogues subtils dans les optimisations LLVM
Cet article explore l’importance d’une sémantique précise pour les représentations intermédiaires du compilateur (IR), en particulier pour les langages comme C, C++ et Rust qui permettent la manipulation de pointeurs non sécurisés. L’auteur montre comment une séquence de trois optimisations du compilateur LLVM apparemment correctes peut conduire à un comportement incorrect du programme. La cause première est la provenance des pointeurs : les informations supplémentaires intégrées à un pointeur au-delà de son adresse mémoire, qui précisent comment il a été calculé. Cela nécessite une spécification IR LLVM plus précise, y compris une définition précise du comportement indéfini (UB). Considérer les IR des compilateurs comme des langages de programmation autonomes avec des spécifications rigoureuses est essentiel pour résoudre ces problèmes.