Erreur de segmentation... Qu'est ce que c'est ??? :o

Résolu
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 - 28 mai 2005 à 14:17
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006 - 28 mai 2005 à 18:38
Salut tout le monde j'ai un gros problème et malgré tous mes essais je n'arrive pas à le résoudre...

Il n'y a pas d'erreurs à la compilation mais lorsque je lance mon prog
un message d'erreur s'affiche : "An unhandled win32 exception occured
in R-Pacman.exe [3288]".

Lorsque je lance le débuggeur de DevCpp (v4.9.9.2) il me dit "Une
violation d'accès (erreur de segmentation) est apparue dans votre
programme"...

Ma première question est : qu'est ce qu'une erreur de segmentation ?

Ensuite j'aimerais savoir comment résoudre ce problème ^^

D'après le débuggeur, l'erreur vient de là:



map[(int)(joueur.getXpos()/40)][(int)(joueur.getYpos()/40)]=0;



map

est un tableau d'entiers; il est membre privé de la classe Pastille (la
ligne de code ci-dessus est dans le constructeur de la classe)

joueur est de type Joueur et getXpos() et getYpos() sont deux fonctions
membres (public) de la classe Joueur qui renvoient les valeurs de x et
y, qui sont des membres privés de la classe Perso.

Et Joueur est une classe dérivée de la classe Perso

Je sais pas si tout ce que je viens de dire vous sert à quelque chose pour m'aider mais on sait jamais ^^

A+


==========
**Rouliann**
C++ For Fun!

4 réponses

MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
28 mai 2005 à 14:48
Une erreur de segmentation intervient lorsque le programme tente
d'accéder à des données qui ne lui appartiennent pas (accès à une
adresse qui n'est pas "mappée" par le processus).

Engros, ce que ca veut dire c'est que tu as du depasser les limites du tableau dans cette instruction.

ex: char tab[50];



tab[50] ='\0'; <-- Erreur car le dernier element du tableau est 49





Le probleme des erreurs de segmentation est qu'elle ne sont pas
toujours détectées tout de suite, car parfois les données "au-delà" des
bornes appartienent bien au programme (c'est la dessus que reposent les
failles par "buffer overflow").
3
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
28 mai 2005 à 14:54
MetalDwarf> Pour ce qui est des buffer overflow c'est pas vraiment ce que tu dis.


La mémoire est segmenté en deux grosses parties.
La premiere sert aux variables des programmes.
La deuxieme sert aux programmes eux meme.


Un buffer overflow arrive lorsque la zone mémoire alloué aux programmes est empiété par la zone mémoire reservée aux variables.


Ce qui fait ainsi crasher le PC, ou le programme selon le type d'architecture du microprocesseur.

Shell
0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
28 mai 2005 à 16:09
Ok je crois bien que c'est ça le problème puisque j'ai regardé ce que
renvoie la fonction getXpos() et ca me donne ca : 7.88525e+268... cool
non ? ^^

Bon a partir de là je pense que je vais pouvoir m'en sortir ;)

Merci!

A+

==========
**Rouliann**
C++ For Fun!
0
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
28 mai 2005 à 18:38
Deathcrash > Pour les buffer overflow, c est a la fois ca... et pas
ca. La memoire n est pas segmentee comme tu le decris, pour les buffer
overflow, la cause est que l ecriture de donnees au dela des bornes
permet de modifier une adresse stockee en memoire (l adresse de
retour), et donc de la faire pointer vers une autre zone, qui est une
zone de donnees dans laquelle est ecrite du code qui sera alors execute
(la pile). Donc la cause du buffer overflow est non seulement le manque
de protection contre l execution de la pile sur x86 (corrige que
x86-64), mais surtout une ecriture au dela des bornes du tableau.
0
Rejoignez-nous