Erreur de segmentation... Qu'est ce que c'est ??? :o [Résolu]

Rouliann 115 Messages postés samedi 20 décembre 2003Date d'inscription 23 août 2008 Dernière intervention - 28 mai 2005 à 14:17 - Dernière réponse : MetalDwarf 241 Messages postés mardi 29 octobre 2002Date d'inscription 23 janvier 2006 Dernière intervention
- 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!
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
MetalDwarf 241 Messages postés mardi 29 octobre 2002Date d'inscription 23 janvier 2006 Dernière intervention - 28 mai 2005 à 14:48
3
Merci
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").

Merci MetalDwarf 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de MetalDwarf
DeAtHCrAsH 2674 Messages postés vendredi 25 janvier 2002Date d'inscription 6 février 2013 Dernière intervention - 28 mai 2005 à 14:54
0
Merci
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
Commenter la réponse de DeAtHCrAsH
Rouliann 115 Messages postés samedi 20 décembre 2003Date d'inscription 23 août 2008 Dernière intervention - 28 mai 2005 à 16:09
0
Merci
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!
Commenter la réponse de Rouliann
MetalDwarf 241 Messages postés mardi 29 octobre 2002Date d'inscription 23 janvier 2006 Dernière intervention - 28 mai 2005 à 18:38
0
Merci
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.
Commenter la réponse de MetalDwarf

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.