Ma fonction "détruit" ma variable ! - C - Programmation
Marsh Posté le 02-05-2005 à 20:25:04
Elle est déclarée comment ta variable *chemin ?
Et l'erreur quand ça plante, c'est quoi ?
Marsh Posté le 02-05-2005 à 20:29:13
Elmoricq a écrit : Elle est déclarée comment ta variable *chemin ? |
char [25]
et j'ai une erreur "normal" de windows, "Windows a rencontrer un problème avec le programme ... "
rien de plus
( le pire c'est que je fais des strcpy de cette meme variable à plein d'autres endroits, et jamais eu aucun problème ! )
Marsh Posté le 02-05-2005 à 20:34:02
Slay a écrit : char [25] |
je viens de me rendre compte en fesant le debug que ce sont TOUTES mes variables qui s'éfface juste APRES la fin de la fonction
=>
+ chemin 0xcccccccc ""
+ index 0xcccccccc
+ fp 0xcccccc00
+ fichier 0x0012fae0 "ÌÌNÌ"
+ patient {...}
+ subi 0x0012f890
j -858993460
i -858993460
ind_pat -858993460
Marsh Posté le 02-05-2005 à 20:35:10
Elmoricq a écrit : C'est quoi ton type SUBI_EXAMENS ? |
Code :
|
mais comme j'ai dis plus haut, toutes mes variables sont affectées ( je m'en étais pas rendu compte au début )
Marsh Posté le 02-05-2005 à 20:36:47
Clair qu'il y a un problème dans ta boucle.
Déjà j'aime pas ta condition d'arrêt.
Ensuite, tu es sûr de ton "subi++" ?!
Enfin, ta variable "pointeur" qui peut être égale à -1, elle symbolise quoi ?
Marsh Posté le 02-05-2005 à 20:40:54
# char fichier[20];
# FILE *fp;
# strcpy(fichier,chemin);
# strcat(fichier,"_subi.dat" );
Quel est le nombre maximal de caractères que peut contenir "chemin" sans qu'il n' y ait un comportement indéfini ?
Marsh Posté le 02-05-2005 à 20:42:02
Elmoricq a écrit : Clair qu'il y a un problème dans ta boucle. |
le pointeur c'est l'enregistrement suivant , s'il n'en existe pas ,c'est égale à -1
Subi est initialisé dans la fonction précédente et est un vecteur de structure
donc si ligne = -1 ( qui est en réalité que le pointeur vers la structure suivante) cela signifie que l'on est a la fin du chainage
Marsh Posté le 02-05-2005 à 20:44:14
++fab a écrit : # char fichier[20]; |
20 également , je viens de tester à 25 et ca fonctionne
je comprend pas pcq dans mes teste mon " chemin " était formé de 11 caractères , je pensais pas que le problème pouvait venir de là, honte à moi
N'empeche c'est bizzare comment ca bouzillait toutes les variables
Merci bien , comme quoi des fois c'est vraiment un truc débile
Marsh Posté le 02-05-2005 à 20:49:42
prend un chemin de 20 caracteres par exemple, et ça ne fonctionnera plus à nouveau. Pourquoi ? refléchit un peu à ça :
# strcpy(fichier,chemin);
# strcat(fichier,"_subi.dat" ); *
demande toi combien de caractères a "fichier" à chaque instruction.
Marsh Posté le 02-05-2005 à 20:52:06
++fab a écrit : prend un chemin de 20 caracteres par exemple, et ça ne fonctionnera plus à nouveau. Pourquoi ? refléchit un peu à ça : |
oui exact
je viens de penser que le faite que les variables "plantaient" , vu que je dépassais la taille prévue j'allais écrire sur les autres variables dans la mémoire
ps : comme quoi l'assembleur ca permet de comprendre certaines choses
Marsh Posté le 02-05-2005 à 20:55:15
bravo, c'est ce qui provoquait ce comportement indéfini.
Maintenant, à toi de jouer pour trouver la parade
Marsh Posté le 02-05-2005 à 21:03:02
Slay a écrit : |
que voila un magnifique buffer overflow
Code :
|
tu as l'âme d'un cracker ?
lors de l'appel de la fonction, les parametres, ..., les variables locales sont empilés par adresse decroissantes, ce qui fais qu'un overflow sur le tableau fichier corrompt ta pile en ecrivant vers les parametres.
l'article sur wikipedia
http://fr.wikipedia.org/wiki/D%C3% [...] _de_tampon
Marsh Posté le 02-05-2005 à 21:04:48
skelter a écrit : que voila un magnifique buffer overflow
|
le pire c'est que je le savais bien mais je n'y avais pas pensé
Edit : je savais pas que cela se fesait aussi facilement en C, en ASM en 2 lignes c'est fait mais je croyais que le C protégait un peu plus
Marsh Posté le 02-05-2005 à 21:06:26
Je n'ai pas bien compris ce que tu voulais faire, mais déjà je travaillerais un peu plus dans la sécurité :
|
Modifie ce code pour être conforme à ce que tu fais et fourni un moyen de créer le fichier de données...
Marsh Posté le 02-05-2005 à 21:08:14
Slay a écrit : |
ben la puissance et la flexibilité du C se paye par aucun controles de bord
edit: le C c'est juste un asm de haut niveau
edit2: et portable
Marsh Posté le 02-05-2005 à 21:11:05
skelter a écrit : ben la puissance et la flexibilité du C se paye par aucun controles de bord |
enfin bon , en gros j'aurai pu faire planté la machine si mon overflow était beaucoup plus important ( sauf si windows, lui, protège les endroits "critiques" de la mémoire )
Marsh Posté le 02-05-2005 à 21:17:54
Un processus dispose de son propre espace d'adressage (pas de tout temps, mais aujourd'hui oui )
Donc pour répondre à ta question : non
Marsh Posté le 02-05-2005 à 21:18:35
Slay a écrit : je savais pas que cela se fesait aussi facilement en C, en ASM en 2 lignes c'est fait mais je croyais que le C protégait un peu plus |
Non. En C, rien ne te protège d'un comportement indéfini. Il peut arriver n'importe quoi.
Marsh Posté le 02-05-2005 à 21:26:21
Emmanuel Delahaye a écrit : Non. En C, rien ne te protège d'un comportement indéfini. Il peut arriver n'importe quoi. |
Si, une vieille barbe de 68ard
Marsh Posté le 02-05-2005 à 20:19:52
Le premier printf("%s",chemin); se passe sans problème mais le deuxième, mon programme plante ( erreur windows ) , on dirait que la variable chemin s'est "détruite" lors de l'exécution de Creer_subi
Or je ne l'utilise que dans un strcpy , comme deuxième argument, il ne devrait donc subir aucune modif et encore moins devenir "inutilisable"
Quelqu'un à une idée ?
PS : J'utilise Visual C++ 6.0
Merci d'avance , parce que sur ce coup-là ,je bloque
Message édité par Slay le 02-05-2005 à 20:23:29