Segmentation fault

Segmentation fault

Erreur de segmentation

Page d'aide sur l'homonymie Pour les articles homonymes, voir 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é.

Les applications, lorsqu'elles s'exécutent, ont besoin de mémoire vive, 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 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 ne sont pas volontaires (si elles le sont, il y a de fortes chances que cela soit dans un but délictueux), elles sont dues à une mauvaise conception ou réalisation de l'application.

Sommaire

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é de mémoire. C'est ensuite à la charge 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 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.

Une autre cause d'erreur de segmentation 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 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 des exemples de programme en C qui peuvent produire une telle erreur.

Exemple avec une variable

 #include <stdio.h>
 
 int 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 (par défaut il s'agit du clavier) et stocke cette valeur dans une variable. Pour pouvoir y stocker la donnée, 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.

Nous voulions stocker la valeur récupérée par scanf dans variable_entiere et nous devions donc passer en argument l'adresse de notre variable (en utilisant & devant le nom de la variable) et non sa valeur.

Il aurait fallu remplacer :

scanf("%d", variable_entiere);

par :

scanf("%d", &variable_entiere);

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

Exemple avec un pointeur

 int main() {
   int *pointeur, valeur;
   valeur = 3;
   *pointeur = valeur * valeur;
 }

Le problème ici est que l'on veut stocker le résultat de l'opération valeur * valeur et y avoir accès par un pointeur (nommé ici pointeur). Or, un pointeur n'allouant aucun espace mémoire autre que pour lui-même, on ne peut lui affecter une valeur tant qu'il ne pointe pas sur un espace mémoire correctement alloué (comme une variable) sans risquer de provoquer une erreur de segmentation. Car le pointeur pointe potentiellement à un endroit aléatoire de la mémoire.

Une solution est de créer une seconde variable (nommée ici resultat) sur laquelle pointe le pointeur :

 int main() {
   int *pointeur, valeur, resultat;
   pointeur = &resultat;
   valeur = 3;
   *pointeur = valeur * valeur;
 }
  • Portail de l’informatique Portail de l’informatique
  • Portail de la programmation informatique Portail de la programmation informatique
Ce document provient de « Erreur de segmentation ».

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Segmentation fault de Wikipédia en français (auteurs)

Игры ⚽ Поможем написать курсовую

Regardez d'autres dictionnaires:

  • Segmentation fault — A segmentation fault (often shortened to segfault) is a particular error condition that can occur during the operation of computer software. A segmentation fault occurs when a program attempts to access a memory location that it is not allowed to …   Wikipedia

  • Segmentation Fault — Bei Computern tritt eine Schutzverletzung (v. engl. segmentation fault oder segmentation violation, kurz auch segfault) auf, wenn ein Computerprogramm auf eine Ressource (insbesondere auf Speicher) zuzugreifen versucht, die vor einem solchen… …   Deutsch Wikipedia

  • Segmentation Fault — Erreur de segmentation Pour les articles homonymes, voir 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 …   Wikipédia en Français

  • Segmentation fault — Ошибка сегментации (англ. Segmentation fault или сокращённо segfault)  ошибка программного обеспечения, возникающая при попытке обращения к недоступным для записи участкам памяти либо при попытке изменения памяти запрещённым способом. В системах… …   Википедия

  • segmentation fault — noun A software error that occurs when a program attempts to access a memory location that it is not permitted to access. Syn: access violation, segfault …   Wiktionary

  • Segmentation — may mean: *Market segmentation, in economics Biology *A morphogenesis process that divides a metazoan body into a series of semi repetitive segments *Segmentation (biology), the structure that results from said processComputing *Segmentation… …   Wikipedia

  • Segmentation (informatique) — Pour les articles homonymes, voir Segmentation. En informatique, la segmentation est une technique gérée par l unité de segmentation de la MMU, utilisée sur les systèmes d exploitation modernes, qui divise la mémoire physique (dans le cas de la… …   Wikipédia en Français

  • General protection fault — This article is about the x86 exception. For the webcomic, see General Protection Fault (webcomic). A general protection fault (GPF) in the Intel x86 and AMD x86 64 architectures, and other unrelated architectures, is a fault (a type of… …   Wikipedia

  • Segmention Fault — Bei Computern tritt eine Schutzverletzung (v. engl. segmentation fault oder segmentation violation, kurz auch segfault) auf, wenn ein Computerprogramm auf eine Ressource (insbesondere auf Speicher) zuzugreifen versucht, die vor einem solchen… …   Deutsch Wikipedia

  • Erreur De Segmentation — Pour les articles homonymes, voir 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… …   Wikipédia en Français

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”