Ce qui est erreur de segmentation ? Est-ce différent en C / C++ ? Comment sont liés les erreur de segmentation et pointeur mal placé ?
Réponses
Trop de publicités?Faute de Segmentation est un type spécifique de l'erreur causée par l'accès à la mémoire qui "ne vous appartient pas." C'est une aide mécanisme qui vous permet d'éviter d'endommager la mémoire et l'introduction de dur-à-debug de la mémoire de bugs. Chaque fois que vous recevez une erreur de segmentation, vous savez que vous faites quelque chose de mal avec la mémoire – pour accéder à la variable qui a déjà été libérée, l'écriture et en lecture seule portion de la mémoire, etc. Faute de Segmentation est essentiellement la même dans la plupart des langues qui vous permettent de gâchis avec la gestion de la mémoire, il n'y a pas de différence principielle entre les erreurs de segmentation en C et C++.
Il existe de nombreuses façons d'obtenir une erreur de segmentation, au moins dans le niveau inférieur de langages tels que C(++). Un bon moyen d'obtenir une erreur de segmentation est de déréférencer un pointeur null:
int *p = NULL;
*p = 1;
Une autre erreur se produit lorsque vous essayez d'écrire à une partie de la mémoire qui a été marqué comme étant en lecture seule:
char *str = "Foo"; // Compiler marks the constant string as read-only
*str = 'b'; // Which means this is illegal and results in a segfault
Balançant d'un pointeur sur une chose qui n'existe plus, comme ici:
char *p = NULL;
{
char c;
p = &c;
}
// Now p is dangling
Le pointeur p
dangles, car il souligne le caractère variable c
qui ont cessé d'exister après le bloc terminé. Et lorsque vous essayez de déréférencer balançant pointeur (comme *p='A'
), vous obtiendriez probablement une erreur de segmentation.
Il serait intéressant de noter que, faute de segmentation n'est pas causé directement par l'accès à un autre processus de la mémoire (c'est ce que j'entends parfois), comme il n'est tout simplement pas possible. Avec de la mémoire virtuelle chaque processus a son propre espace d'adressage virtuel et il n'y a aucun moyen d'accéder à un autre à l'aide de n'importe quelle valeur de pointeur. Exception à cette règle peut être bibliothèques partagées qui sont à la même adresse physique de l'espace cartographié à (peut-être) les différentes adresses virtuelles et de la mémoire du noyau qui est déjà analysées de la même manière dans tous les processus (pour éviter TLB la rougeur de la syscall, je pense). Et des choses comme shmat ;) - ce sont ce que je considère comme 'indirect' accès. On peut, toutefois, de vérifier qu'ils sont généralement situés loin de code processus et nous sommes généralement en mesure d'y accéder (c'est pourquoi ils sont là, néanmoins leur accès dans une mauvaise façon de produire erreur de segmentation).
Encore, faute de segmentation peut se produire dans le cas de l'accès à notre propre (processus) dans la mémoire de manière inappropriée (par exemple en essayant d'écrire à la non-écriture de l'espace). Mais la raison la plus courante pour ce qui est de l'accès à la partie de l'espace d'adressage virtuel est associé à physique à tous.
Et tout cela avec le respect de la mémoire virtuelle systèmes.
Une erreur de segmentation est causée par une requête pour une page qui le processus n’a pas ont répertorié dans sa table de descripteur, ou une requête non valide d’une page qu’il inscrit (par exemple une requête d’écriture sur une page en lecture seule).
Un pointeur mal placé est un pointeur qui peut ou ne peut pas pointer vers une page valide, mais point de fait à un segment « inattendu » de mémoire.
Pour être honnête, comme d'autres affiches ont mentionné, Wikipédia a un très bon article sur ce ont donc un coup d'oeil. Ce type d'erreur est très fréquente et souvent appelé d'autres choses comme la Violation d'Accès ou de défaillance de Protection Générale.
Ils ne sont pas différents en C, C++ ou tout autre langage qui permet de pointeurs. Ces types d'erreurs sont généralement causées par des pointeurs qui sont
- Utilisé avant d'être correctement initialisé
- Utilisé après le mémoire qu'ils ont point a été realloced ou supprimés.
- Utilisé dans un tableau indexé, où l'index est en dehors des limites du tableau. C'est en général seulement quand vous êtes en train de faire le pointeur de maths sur les traditionnels tableaux ou c-strings, pas STL / Boost des collections (en C++.)
De Wikipedia:
Une erreur de segmentation se produit lorsqu'un programme tente d'accéder à un emplacement de mémoire qu'il n'est pas autorisé à accéder ou de tenter d'accéder à un emplacement de mémoire dans une voie qui n'est pas autorisé (par exemple, la tentative d'écriture dans un emplacement en lecture seule, ou pour remplacer une partie du système d'exploitation).
La Segmentation est une approche de la gestion de la mémoire et de la protection du système d'exploitation. Il a été remplacé par de la pagination pour la plupart des besoins, mais une grande partie de la terminologie de la segmentation est toujours utilisée, "segmentation fault" en étant un exemple. Certains systèmes d'exploitation ont encore de segmentation à un certain niveau logique bien que la pagination est utilisé comme mémoire principale de la politique de gestion.
Sur les systèmes de type Unix, un processus qui accède à une adresse mémoire non valide reçoit le signal SIGSEGV. Sur Microsoft Windows, un processus qui accède à la mémoire invalide reçoit le STATUS_ACCESS_VIOLATION exception.
En balançant les pointeurs, cependant, surviennent lorsqu'un objet est supprimé ou libéré, sans modifier la valeur du pointeur de la souris, de sorte que le pointeur pointe toujours vers l'emplacement mémoire de la désallocation de la mémoire. Le système pourrait réaffecter précédemment libéré de la mémoire d'un autre processus, si le programme d'origine puis déréférence le (maintenant) bancales pointeur, peut entraîner un comportement imprévisible, comme la mémoire peut maintenant contenir des données totalement différentes. C'est particulièrement le cas si le programme enregistre les données dans la mémoire pointée par un bancales pointeur, un silence de corruption de données non liées peuvent apparaître, de bogues subtils qui peuvent être extrêmement difficiles à trouver, ou à cause de la segmentation des défauts (*NIX) ou des erreurs de protection générale (Windows). Si l'écrasement de données est tenue de la comptabilité de données utilisées par le système de l'allocateur de mémoire, la corruption peut provoquer une certaine instabilité du système.
Sauvage pointeurs surviennent lorsqu'un pointeur est utilisé avant l'initialisation de certains connus de l'état, ce qui est possible dans certains langages de programmation. Ils montrent le même comportement erratique comme balançant des pointeurs, même s'ils sont moins susceptibles de rester inaperçus.