Purify me dit ca... [C] - C - Programmation
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
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?
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 ?
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 !
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 ..?
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 !
Marsh Posté le 22-04-2004 à 21:17:43
christophe_d13 a écrit :
|
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
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';
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); |
ça veut rien dire ça d'ailleurs.
christophe_d13 a écrit : |
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
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é !
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 ?
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.
Marsh Posté le 22-04-2004 à 21:27:18
de meme &(i-3)[s]
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...
Marsh Posté le 22-04-2004 à 21:30:02
Merci a toi christophe_d13 aussi..
Ca arrive a tt le monde de se tromper!
Marsh Posté le 22-04-2004 à 21:46:22
ben33> Ouais ben se tromper comme ça c'est de l'abomination !
Marsh Posté le 22-04-2004 à 22:44:14
ben33 a écrit : ... |
Pourquoi faire du code aussi compact, c'est pas évident à relire.
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
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?
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
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