Erreur de segmentation
Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Une erreur de segmentation (en anglais segmentation fault, parfois appelé en abrégé segfault), est un plantage d'une application qui a tenté d'accéder à un emplacement mémoire qui ne lui était pas alloué.

Les applications, lorsqu'elles s'exécutent, ont besoin (Les besoins se situent au niveau de l'interaction entre l'individu et l'environnement. Il est souvent fait un classement des besoins humains en trois grandes catégories : les besoins primaires, les besoins secondaires et les besoins...) de mémoire vive (La mémoire vive, mémoire système ou mémoire volatile, aussi appelée RAM de l'anglais Random Access Memory (que l'on traduit en français par 'mémoire à accès aléatoire'), est la mémoire...), allouée par le système d'exploitation. Une fois allouée à l'application, aucune autre application ne peut avoir accès à cette zone. Cela garantit une sûreté de fonctionnement pour chaque application contre les erreurs des autres. Ainsi, si une application tente le moindre accès à une zone mémoire (D'une manière générale, la mémoire est le stockage de l'information. C'est aussi le souvenir d'une information.) qui ne lui est pas allouée, le système d'exploitation le détecte et stoppe immédiatement son exécution.

La très grande majorité des erreurs de segmentation (De manière générale, le mot segmentation désigne l'action de segmenter, le fait de se segmenter ou son résultat. En particulier, le mot est employé...) ne sont pas volontaires (si elles le sont, il y a de forte chance que cela soit dans un but délictueux), elles sont dues à une mauvaise conception ou réalisation de l'application.

Exemples

Lorsqu'un programme s'exécute, le système d'exploitation lui alloue de la mémoire. Mais il arrive qu'au cours de son exécution, pour ses besoins de traitements, l'application ait besoin de mémoire supplémentaire. Elle demande alors au système d'exploitation de lui allouer une certaine quantité (La quantité est un terme générique de la métrologie (compte, montant) ; un scalaire, vecteur, nombre d’objets ou d’une autre manière de...) de mémoire. C'est ensuite à la charge (La charge utile (payload en anglais ; la charge payante) représente ce qui est effectivement transporté par un moyen de transport donné, et qui donne lieu à un paiement ou un bénéfice non pécuniaire pour...) de l'application d'utiliser cette mémoire et de faire attention à ne pas écrire ou lire en dehors de la zone mémoire allouée.

Tout (Le tout compris comme ensemble de ce qui existe est souvent interprété comme le monde ou l'univers.) le problème est de bien savoir où l'on se trouve lorsque l'on utilise cette mémoire. Et c'est à ce moment là que si l'on y prend pas garde, on déborde de la mémoire et l'application se termine. C'est ce que l'on nomme un dépassement de tampon (En informatique, un dépassement ou débordement de tampon (en anglais, buffer overflow) est un bogue pouvant être exploité pour violer la...).

Une autre cause d'erreur de segmentation (Une erreur de segmentation (en anglais segmentation fault, parfois appelé en abrégé segfault), est un plantage d'une application qui a tenté d'accéder à un emplacement mémoire qui ne lui était pas alloué.) est la mauvaise initialisation d'un pointeur. Ce dernier pointe alors sur une zone mémoire quelconque et lorsqu'on l'utilise, il y a de forte chances pour que ce dernier contienne une adresse (Les adresses forment une notion importante en communication, elles permettent à une entité de s'adresser à une autre parmi un ensemble d'entités. Pour qu'il n'y ait pas d'ambiguïté, chaque adresse doit...) qui n'est pas allouée à l'application. Et comme précédemment, c'est une erreur de segmentation que le système d'exploitation génère.

Programme produisant une erreur de segmentation

Voici un exemple de programme en C qui peut produire une telle erreur :

 
 #include  
 void main() { 
 int variable_entiere; 
 scanf("%d", variable_entiere); 
 } 
 

La fonction "scanf" a pour but de récupérer un entier sur l'entrée standard (couramment il s'agit du clavier) et stocke cette valeur dans une variable (En mathématiques et en logique, une variable est représentée par un symbole. Elle est utilisée pour marquer un rôle dans une formule, un prédicat ou un algorithme. En statistiques, une variable...). Pour pouvoir y stocker la donnée (Dans les technologies de l'information, une donnée est une description élémentaire, souvent codée, d'une chose, d'une transaction, d'un...), "scanf" a besoin de connaître l'adresse de la variable (dans notre cas variable_entiere). Or, dans notre cas nous passons la valeur de variable_entiere, qui n'est pas initialisée et a donc une valeur quelconque.

La fonction "scanf" tente alors d'accéder à la zone mémoire représentée par la valeur contenue dans variable_entiere et provoque (du moins il y a de très fortes chances) une erreur de segmentation.

Il aurait fallu remplacer :

 
 scanf("%d", variable_entiere); 
 

par :

 
 scanf("%d", &variable_entiere); 
 

Pour que le programme se comporte comme nous le désirions.

Page générée en 0.081 seconde(s) - site hébergé chez Amen
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
Ce site est édité par Techno-Science.net - A propos - Informations légales
Partenaire: HD-Numérique