En programmation, les erreurs dans le code sont gérées via un flux que l’on appelle ‘exception’.
Il est possible de traquer ces exceptions via une instruction try … catch. Et par la suite, la gérer et la traiter. Il s’agit d’un des premiers savoirs que l’on enseigne aux étudiants en informatique.
Néanmoins, il existe des erreurs qui ne sont pas des exceptions, des erreurs tellement graves que le langage machine interdit de les gérer, ce ne sont pas des exceptions au sens propre.
L’une d’elle est appelée ‘segmentation fault’
C’est cette erreur qui a fait planter la moitié des PC Windows de la planète le 19 juillet 2024. Le logiciel en cause, ayant des droits administrateur, a obligé Windows à activer l’écran de la mort qui tue.
Au-delà de la panne géante, ce problème à une excellente raison d’être.
Le segmentation fault : la sécurité avant tout.
Une faute de segmentation est une erreur qui se produit lorsqu'un programme informatique tente d'accéder à une zone de la mémoire qui ne lui est pas permise.
Cette erreur permet au système d'exploitation de prévenir l'accès non autorisé à des zones de mémoire. Cela protège les données sensibles et empêche les programmes malveillants ou bogués de corrompre ou de lire des informations auxquelles ils ne devraient pas avoir accès.
Il s’agit d’une mesure de protection de base de tout système informatique.
Une autre raison est l’isolation stricte des processus, au minimum pour éviter les accès concurrents à la zone mémoire affectée à un programme.
Le segmentation fault par l’exemple en PHP.
Pour visualiser un segmentation fault, on va prendre un exemple concret.
Les langages web modernes permettent en théorie de traiter en amont ce type d’erreur. Mais il peut arriver qu’un cas soit mal géré.
Un des exemples se trouve sur des chaînes de caractère dont la longueur réelle est inférieure à la longueur calculée. C’est le cas si celle-ci implémente des caractères interdits suite à un copier-coller.
Exemple :
\$str = ‘blabla[un symbole non unicode]blabla’
La taille de cette chaîne est de 13 selon PHP mais en mémoire, elle n’est que de 12.
Au moment où une opération sera réalisée sur cette chaîne, l’OS va refuser l’accès au treizième caractère et va stopper l'exécution par un segmentation fault.
Aucun logue ne sera visible côté PHP, vu que ce n’est pas une exception.
Comment éviter un segmentation fault
J’ai déjà eu cette erreur avec un client PHP Mongodb, la DB contenait un de ces fameux caractères interdit qui provoque un problème de taille de chaine de caractère.
Il s’agit d’une erreur très complexe à corriger, mais par principe, elle provient sûrement d’une donnée corrompue et il faut la traiter en amont.
Utilisez des outils comme Valgrind : https://valgrind.org/ pour vous aider à repérer l’erreur bien plus facilement.
La segmentation existe dans la programmation web, son équivalent direct est la sécurité CORS (Cross Origin Resource Sharing), interdisant à un programme sur un domaine d'accéder aux ressources d’un autre domaine.