Math Is Hard – OpenBSD Stories
Lors du développement noyau, les détails spécifiques au processeur deviennent critiques et certains choix d'architecture peuvent compliquer fortement le travail des développeurs. Sur la VAX, le modèle d'exceptions distingue les traps, où le PC sauvé pointe vers l'instruction suivante, des faults, où le PC pointe vers l'instruction fautive afin de permettre une reprise, ce qui a des implications importantes pour le traitement des signaux. Historiquement les VAX‑11/780 implémentaient les exceptions arithmétiques en tant que traps tandis que les modèles ultérieurs passèrent certaines exceptions à des faults et que les 11/780 furent révisés, changeant subtilement le comportement attendu par les systèmes d'exploitation. En 2002 un bug sur OpenBSD (révélé lors d'une mise à jour de Perl) montra qu'ignorer SIGFPE pouvait déclencher une boucle infinie parce que le noyau renvoyait l'exécution sur l'instruction fautive, et la correction a consisté à ajouter une routine skip_opcode qui désassemble l'instruction VAX à longueur variable pour avancer le PC avant de délivrer le signal. La correction, peaufinée pour être indépendante du débogueur et appliquée en priorité avant trapsignal, a résolu le problème et illustre que des changements matériels anciens et peu documentés peuvent produire des bogues de longue date difficiles à détecter car leur situation est rare et peu testée.