Qu'est-ce que SEGV_MAPERR?

Réponses:

197

Il existe deux types courants de SEGV , qui sont une erreur résultant d'un accès mémoire non valide:

  1. Une page a été accédée avec les mauvaises autorisations. Par exemple, il était en lecture seule mais votre code a essayé d'y écrire. Cela sera signalé comme SEGV_ACCERR .
  2. Une page a été accédée qui n'est même pas du tout mappée dans l'espace d'adressage de l'application. Cela résultera souvent du déréférencement d'un pointeur nul ou d'un pointeur corrompu avec une petite valeur entière. Ceci est signalé comme SEGV_MAPERR .

La documentation d'un tri (code source Linux indexé) pour SEGV_MAPERR est ici: http://lxr.free-electrons.com/ident?i=SEGV_MAPERR .

ahcox
la source
8
Pourquoi stackoverflow.com/a/1000010/358475 est-il marqué comme la réponse alors que celle-ci est plus complète et utile?
OldPeculier
2
La question et les autres réponses sont bien plus anciennes que ma réponse. J'ai modifié l'autre réponse pour l'améliorer au moins.
ahcox
Il serait intéressant de connaître les circonstances qui les différencient des types d'exceptions EXC_BAD_ACCESS. Par exemple, la page est-elle mappée mais non allouée (/ récemment désallouée)?
Bobjt
6
Un exemple de SEGV_MAPERRdébordement de pile (sans jeu de mots). : D
Antti Haapala
2
Il existe encore plus de types de SEGV: elixir.free-electrons.com/linux/latest/source/include/uapi/…
tomasz
40

C'est un défaut de segmentation. Très probablement un problème de pointeur suspendu, ou une sorte de dépassement de tampon.

SIGSSEGV est le signal qui le termine en fonction du problème, faute de segmentation.

Vérifiez les pointeurs suspendus ainsi que le problème de débordement.

L'activation des vidages de mémoire vous aidera à déterminer le problème.

Sev
la source