J'arrive pas à débuger ceci

Signaler
Messages postés
92
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
1 octobre 2003
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Cette fonction parse un buffer. Elle renvoit true si le flag est présent et false s'il ne l'est pas.
Je ne peux pas utiliser strstr() car le buffer comprend des "\0".

Lors du premier appel de cette fonction tout se déroule normalement, mais au 2eme appel, le programme plante à la ligne strncmp()

bool is_flag_present(char *buffer, unsigned long buffer_size)
{
char *ptr = buffer;
for (unsigned long i = 0 ; i < buffer_size ; i++) {
if ( !strncmp(ptr,flag,strlen(flag)) ) return 1;
ptr++;
}
return 0;
}

18 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
et tu es certain que le dernier octet du buffer est un zero ?
BruNews, ciao...
Messages postés
92
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
1 octobre 2003
1
Oui j'en suis sur.
En plus pour débugger j'affichais chaque position de ptr a chaque fois que je l'incrémentais et ca plantait avant la fin du buffer...
Messages postés
92
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
1 octobre 2003
1
Encore une faute de n00b ! J'ai honte :)

Le problème venait d'une autre fonction qui envoyait à celle-ci un buffer vide :)

Il m'a suffit d'ajouter un if (!buffer) au début de cette fonction pour contourner le problème.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Qu'il finisse par un zero autorise seulement l'emploi de strncmp.
Maintenant:
for (unsigned long i = 0 ; i < buffer_size ; i++) ???
BruNews, ciao...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
m'etonnerait que lui evite de planter.
BruNews, ciao...
Messages postés
92
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
1 octobre 2003
1
Si puisque le buffer n'est rien d'autre que le return d'une fonction qui met un fichier dans un buffer.
Cette fonction return NULL si elle n'a pas réussi a ouvrir le fichier. c'est ce "NULL" qui posait problème
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
exact, j'avais mal lu la boucle for.
Alors une fois bien relue, tu peux diminuer son temps de traitement, reflechis chouia.
BruNews, ciao...
Messages postés
92
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
1 octobre 2003
1
en remplacant
if ( !strncmp(ptr,flag,strlen(flag)) ) return 1;
par
if ( !strncmp(ptr,flag,taille_flag) ) return 1;
taille_flag etant strlen(flag);

??
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
1er point mais je pense que le compilo l'aurait resolu pour toi, ceci dit ne jamais penser que le compilo est intelligent.
Autre truc, regarde bien ta for et vois pourquoi tu peux reduire ses tours.
BruNews, ciao...
Messages postés
92
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
1 octobre 2003
1
Je donne ma langue au chat :)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
tu feras autant de tours pour rien que buffer_size-1
logique non ? si il n'y a plus le compte d'octets donc impossible de trouver.
Alors refais, enleve le i mais place un pointeur *pout precalcule:
while(ptr < pout).....
BruNews, ciao...
Messages postés
92
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
1 octobre 2003
1
exact, mais le buffer faisant plusieurs Mo et le flag faisait ~ 30 octets, la différence ne sera pas énorme.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
buffer de plusieurs Mo !!!
Revois ta copie alors, strstr est bien mieux optimise. Plus le compte entre 2 zeros est grand plus tu perdra de temps, il faut ici un algo Boyer Moore, genre strstr, le meilleur etant a mon avis celui de Michael Abrash. Vois si tu trouves par google.
BruNews, ciao...
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
et pourquoi ne pas rajouter une condition avant d'apeller strncmp:

if(*str == *flag){ // test sur le 1er caractere
if (!strncmp(ptr,flag,strlen(flag)) ) return 1;
}

Si on teste juste le 1er caractere avant de strncmp()er, ca eviterait d'appeller strncmp inutilement un grand nombre de fois, non ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Tout a fait mais a ce rythme on finira par reecrire le strstr en C et on fera moins bien que la version ASM de strstr.
on reprend:
while(str < pout) {
if(strstr(str, flag)) return 1;
// ici donc non trouve
// ne pousse pas str de 1 mais jusqu'au prochain 0
}
return 0;
BruNews, ciao...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
et attention a ne pas aller plus loin que pout !!!
BruNews, ciao...
Messages postés
92
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
1 octobre 2003
1
Ouaip je vais modifier ca :) merci
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
char *ptr = buffer;
char *pout = buffer + buffer_size + 1 - strlen(flag);
while(ptr < pout) {
if(strstr(ptr, flag)) return 1;
while(*ptr) ptr++;
ptr++;
}
return 0;

BruNews, ciao...