[C] Purify me dit ca...

Purify me dit ca... [C] - C - Programmation

Marsh Posté le 22-04-2004 à 19:31:29    

[W] UMR: Uninitialized memory read in strcmp {4 occurrences}
 
 
        s= (char*)malloc(10240);
        for (c=' ';c!='>'&&!feof(fd);c=s[i]=NEXTC(fd),i++) {
            s[i+1]=0;
 =>         if (0==strcmp("![CDATA[",s)) {
                for (;!feof(fd)&&(strcmp("]]>",&s[i-3]));s[i]=NEXTC(fd),i++,s[i]=0);
                i--; // For >
                s[i]=0;
 
C'est grave docteur..?


Message édité par ben33 le 22-04-2004 à 19:32:53
Reply

Marsh Posté le 22-04-2004 à 19:31:29   

Reply

Marsh Posté le 22-04-2004 à 19:40:01    

- mauvaise utilisation de feof
- le message est explicite ... ou alors utilise calloc au lieu de malloc

Reply

Marsh Posté le 22-04-2004 à 20:34:01    

Explicite certes.mais je ne comprends pas pourquoi.. c pour ca que je pose la question!
 
QU'entends tu par mauvaise utilisation de feof?

Reply

Marsh Posté le 22-04-2004 à 20:47:45    

pour eof, tu fais une recherche sur le forum ou tu lis ta documentation.
 
tu comprends pas pourquoi ? y a quoi sur ce que pointe s lors du premier appel à strcmp ?

Reply

Marsh Posté le 22-04-2004 à 21:04:49    

for (;!feof(fd)&&(strcmp("]]>",&s[i-3]));s[i]=NEXTC(fd),i++,s[i]=0);
 
&s[i-3] Il y a altération du pointeur ici... Ainsi l'emplacement de la mémoire est modifiée brutalement... Il est perdue et pointe sur une zone non allouée !


Message édité par christophe_d13 le 22-04-2004 à 21:06:44
Reply

Marsh Posté le 22-04-2004 à 21:07:49    

ah... je n'avais pas pensé a ca..
Mais pourquoi Purify me pointe la ligne du dessus alors..?
Et tu resoudrais ca comment ..?

Reply

Marsh Posté le 22-04-2004 à 21:13:22    

Citation :

Mais pourquoi Purify me pointe la ligne du dessus alors..?


Car strcmp accède à la mémoire via un pointeur erroné !

Citation :

Et tu resoudrais ca comment ..?


En enlevant le & gros béta !

Reply

Marsh Posté le 22-04-2004 à 21:17:43    

christophe_d13 a écrit :

Citation :

Mais pourquoi Purify me pointe la ligne du dessus alors..?


Car strcmp accède à la mémoire via un pointeur erroné !

Citation :

Et tu resoudrais ca comment ..?


En enlevant le & gros béta !
 

non, tu racontes n'importe quoi
 
&s[i-3] permet de traiter la sous-chaine pointée par s commença au caractère i-3. il faut que i soit > 3 certes, sinon, il n'y aucun problème

Reply

Marsh Posté le 22-04-2004 à 21:20:27    

=>         if (0==strcmp("![CDATA[",s)) {  
 
la zone pointée pas s n'est pas initializée, résultat, strcmp risque de partir dans le décor ... il va chercher un '\0' finale et peut être ne pas en trouver. il y a n'importe quoi dans s.
 
2 solutions :
- allouer avec calloc qui mets dez '\0' partout
  calloc(10240, 1)
- allouer avec malloc et bien marquer la chaine comme vide
  s = malloc(10240); s[0] = '\0';

Reply

Marsh Posté le 22-04-2004 à 21:22:00    

christophe_d13 a écrit :

for (;!feof(fd)&&(strcmp("]]>",&s[i-3]));s[i]=NEXTC(fd),i++,s[i]=0);
 
&s[i-3] Il y a altération du pointeur ici...


 
ça veut rien dire ça d'ailleurs.

christophe_d13 a écrit :


Ainsi l'emplacement de la mémoire est modifiée brutalement... Il est perdue et pointe sur une zone non allouée !

faux. s garde sa valeur, la zone pointée par s est modifiée, c'est bien le but du programme. le tout est de maitrisé ce processus

Reply

Marsh Posté le 22-04-2004 à 21:22:00   

Reply

Marsh Posté le 22-04-2004 à 21:22:43    

Oups la méga bourde... dsl.
Pour la réponse, taz, tu es dans le juste...
 
Méga faux christophe, méga faux... Promis, la prochaine je ne lirais plus en diagonale...
 
Nan, pas tapé !

Reply

Marsh Posté le 22-04-2004 à 21:24:01    

mais ta qd meme ecrit "&s[i-3] Il y a altération du pointeur ici"
 
c'est parce que t'ecrit en diagonal ?

Reply

Marsh Posté le 22-04-2004 à 21:24:26    

christophe_d13 a écrit :

Promis, la prochaine je ne lirais plus en diagonale...

y a pas de diagonale qui vaille, si s est un pointeur &s[i-3] <=> s + i - 3 est aussi pointeur. donc valide au niveau du typage.

Reply

Marsh Posté le 22-04-2004 à 21:27:18    

de meme &(i-3)[s]


Message édité par skelter le 22-04-2004 à 21:28:53
Reply

Marsh Posté le 22-04-2004 à 21:29:37    

Merci Taz...
En plus c tres didactique.. J'apprécie!
 
Edit : Ne vous "battez" pas tout de meme... :)
Merci de me faire progresser!
Allons tester... puis allons au pb suivant...


Message édité par ben33 le 22-04-2004 à 21:40:37
Reply

Marsh Posté le 22-04-2004 à 21:30:02    

Merci a toi christophe_d13 aussi..
Ca arrive a tt le monde de se tromper!

Reply

Marsh Posté le 22-04-2004 à 21:46:22    

ben33> Ouais ben se tromper comme ça c'est de l'abomination !

Reply

Marsh Posté le 22-04-2004 à 22:44:14    

ben33 a écrit :

...
for (;!feof(fd)&&(strcmp("]]>",&s[i-3]));s[i]=NEXTC(fd),i++,s[i]=0);
...


Pourquoi faire du code aussi compact, c'est pas évident à relire. :pt1cable:  
 

Reply

Marsh Posté le 22-04-2004 à 22:47:00    

tant qu'il est mauvais, ça na pas d'infortance
 
 
s[i]=NEXTC(fd),i++,s[i]=0
 
ok, utilise calloc alors si tout doit être à zéro

Reply

Marsh Posté le 23-04-2004 à 06:57:02    

Taz> 'tant qu'il est mauvais, ça na pas d'infortance '
T'entends quoi par la?

Reply

Marsh Posté le 23-04-2004 à 07:12:43    

que ton code est mauvais à cause des mauvais usage de feof, de toutes ces mises à zéro que tu peux remplacer par un seul calloc, de l'absence du gestion de débordement (si ton fichier fait 1 octet de plus boom), ton i fait le yoyo, c'est quasiment sur que tantot il est négatif, tantot > 10240

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed