J'arrive pas à débuger ceci

guiguikun Messages postés 92 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 1 octobre 2003 - 9 août 2003 à 15:35
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 9 août 2003 à 17:32
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2003 à 16:02
et tu es certain que le dernier octet du buffer est un zero ?
BruNews, ciao...
0
guiguikun Messages postés 92 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 1 octobre 2003 1
9 août 2003 à 16:04
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...
0
guiguikun Messages postés 92 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 1 octobre 2003 1
9 août 2003 à 16:11
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2003 à 16:14
Qu'il finisse par un zero autorise seulement l'emploi de strncmp.
Maintenant:
for (unsigned long i = 0 ; i < buffer_size ; i++) ???
BruNews, ciao...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2003 à 16:16
m'etonnerait que lui evite de planter.
BruNews, ciao...
0
guiguikun Messages postés 92 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 1 octobre 2003 1
9 août 2003 à 16:18
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2003 à 16:26
exact, j'avais mal lu la boucle for.
Alors une fois bien relue, tu peux diminuer son temps de traitement, reflechis chouia.
BruNews, ciao...
0
guiguikun Messages postés 92 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 1 octobre 2003 1
9 août 2003 à 16:28
en remplacant
if ( !strncmp(ptr,flag,strlen(flag)) ) return 1;
par
if ( !strncmp(ptr,flag,taille_flag) ) return 1;
taille_flag etant strlen(flag);

??
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2003 à 16:34
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...
0
guiguikun Messages postés 92 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 1 octobre 2003 1
9 août 2003 à 16:39
Je donne ma langue au chat :)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2003 à 16:43
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...
0
guiguikun Messages postés 92 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 1 octobre 2003 1
9 août 2003 à 16:46
exact, mais le buffer faisant plusieurs Mo et le flag faisait ~ 30 octets, la différence ne sera pas énorme.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2003 à 16:51
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...
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
9 août 2003 à 16:53
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 ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2003 à 17:06
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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2003 à 17:07
et attention a ne pas aller plus loin que pout !!!
BruNews, ciao...
0
guiguikun Messages postés 92 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 1 octobre 2003 1
9 août 2003 à 17:26
Ouaip je vais modifier ca :) merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 août 2003 à 17:32
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...
0
Rejoignez-nous