[DEV-CPP]ARCHIVAGE DES LIENS D'UNE RECHERCHE SUR GOOGLE

cs_max12
Messages postés
1491
Date d'inscription
dimanche 19 novembre 2000
Statut
Modérateur
Dernière intervention
7 juillet 2014
- 22 mai 2007 à 12:15
fagroud
Messages postés
1
Date d'inscription
samedi 1 décembre 2007
Statut
Membre
Dernière intervention
16 décembre 2008
- 16 déc. 2008 à 00:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42789-dev-cpp-archivage-des-liens-d-une-recherche-sur-google

fagroud
Messages postés
1
Date d'inscription
samedi 1 décembre 2007
Statut
Membre
Dernière intervention
16 décembre 2008

16 déc. 2008 à 00:49
s'il vous plait aidez moi
je viens de faire mes premiers pas avec dev c++ , franchemant c'est un bon environnement pour prigrammer sauf moi j'ai l'habitude d'utliser le c sous dos
j'ai trouvé des difficultés à executer mes programmes qui d'aileurs sont bien compilé mais lors de l'excution j'ai un message d'erreur sous forme d'une fenêtre windows et l'execution s'arrete surtout lorsque je manipule les pointeurs avec reservation de la mémoire avec calloc
voici la source
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int *file;
int ar,ae,drapeau_aj,drapeau_sup,creer,choix,test,dmax;
void creafile(int *e, int *r, int *v,int n)
{

v=(int *)calloc(n,sizeof(int)))

(*e)=0;
(*r)=0;

}
int filevide(int *e,int *r,int drapeau)
{
int vide;
if((drapeau==1)&&(*e)==(*r)) vide=1;
else vide=0;
return(vide);
}
int filepleine(int *e,int *r,int drapeau)
{
int pleine;
if((drapeau==1)&&(*e)==(*r)) pleine=1;
else
{pleine=0;}
return(pleine);
}
void ajouter(int *r, int *v,int n)
{
int ajout;
printf("n Merci de preciser la valeur antiere a ajouter dans la file \n");
scanf("%d",&ajout);
v[(*r)]=ajout;
(*r)=(*r)+1;
if((*r)>=n)(*r)=0;
printf("\n valeur %d ajouter avec succes\n",ajout);
}
c'est la partie ou il ya un probléme
pourtant sous l'environnement dos le prigramme s'execute sans aucun probléme
votre aides s'il vous plait
cs_Thaeron
Messages postés
202
Date d'inscription
vendredi 6 juillet 2001
Statut
Membre
Dernière intervention
31 octobre 2007

24 mai 2007 à 12:39
Quand tu fais : rech = (CHAR *) malloc (len_argv1 + 1);
si len_argv1 vaut 10 par exemple, tu alloues 11 caractères donc de *(rech + 0) à *(rech + 10) ou en encore de rech[0] à rech[10] ; Donc si tu fais rech[len_argv + 1] = '\0' c'est équivalent dans l'exemple à rech[11] = '\0' !
Pour le timeout, 2 conseils : utilise select() pour ne pas bloquer sur recv() (ça te permettra de recevoir les données que lorsqu'il y'en a de disponible et de virer ton thread), et si tu veux détecter la fin de la transmission de la page utilise HTTP/1.0 à la place de HTTP/1.1, le serveur fermera la connexion une fois la page transmise.

Pour stdup() et calloc() les pages de manuels sont tes amies.
Enjoy,
Thaeron
sebastienmz
Messages postés
139
Date d'inscription
mardi 16 mai 2006
Statut
Membre
Dernière intervention
23 juin 2008

24 mai 2007 à 11:52
Donc je vais corriger tous ça mais je comprend pas je calcule la taille des argv et ensuit j'alloue l'espace COMPREND PAS si tu peut un peut approfondir le sujet des malloc car j'ai pas compris
strdup()ça fait un moment que l'on m'en parle mais j'ai pas vraiment compris
Calloc je connais le nom mais rien de plus
A les thread J'ADORE CA C'EST UNE DES MEILLEURS PARTIE DU C, mais en faite j'ai mis des thread pour avoire un time out sur la reception du contenu car quand je l'ai fait je n'étais pas sur une bonne ligne et certain packet prennais trop de temps a arriver.
Pour la requete je vais corriger ça toute suite
Pour linux je suis en multi boot avec aussi plusieur vmware et pour les man je fait GOOGLE man la fonction
je te remercie pour ton aide je vais corriger tout ça ce soire !
MERCI !!!
sebastienmz
Messages postés
139
Date d'inscription
mardi 16 mai 2006
Statut
Membre
Dernière intervention
23 juin 2008

24 mai 2007 à 11:39
Pour l'assembleur ce qui pourrais s'intéresser c'est les protection anti-debugger ou anti-machine virutelle dans du code en C si quelqu'un pourrait me renseigner ça serait sympa
cs_Thaeron
Messages postés
202
Date d'inscription
vendredi 6 juillet 2001
Statut
Membre
Dernière intervention
31 octobre 2007

23 mai 2007 à 22:37
Salut, j'ai porté ton code sous linux pour le tester.
Il est plein de maladresses (excusables vu que ça fait peu de temps que tu fais du C) mais aussi d'erreurs.
Je vais en détailler le maximum mais je vais sûrement en oublier (surtout que j'ai pas fini de tout corriger).
On commence avec le main :
rech = (CHAR *) malloc (len_argv1 + 1);
rech[len_argv1 + 1] = '\0';
(idem pour path)
C'est faux bien sûr ! tu écris au delà de ce que tu as alloué, la ligne correcte est : rech[len_argv1] = '\0';
Ensuite :
memcpy (path, argv[2], len_argv2);
path[len_argv2 + 1] = '\0';
sprintf (path, "%s.txt", argv[2]);
(passons sur le +1) a quoi ça sert de faire un memcpy() si ensuite tu écrases tout par sprintf() ? Pire ! tu as alloué pour la taille de argv[2] et tu écris 4 caractères de plus, donc tu débordes !
Puis un appel à resolv() en lui passant un const char*, or dans resolv tu as " gethostname (host, sizeof (host));" donc un coup de page de manuel et je vois que gethostname place le nom d'host dans la chaine qu'on lui file en premier paramètre soit ici un const ! Donc c'est très mal (sous linux ça plante le prog direct), en plus cette fonction (dans ton utilisation) est absolument inutile.

On arrive à la fonction connect () :
int re[MAX_RECV];
for (i = 0; i <= MAX_RECV; i++)
re[i] = 1;
Et bam un overflow de plus, si tu alloues x entiers, ils vont de 0 à x-1
donc la ligne correcte est for (i = 0;i < MAX_RECV; i++)
Ensuite tu copies des machins dans buffer:
memcpy (buffer, begin, strlen (begin));
Tu utilises memcpy() mais tu ne recopies pas le caractères '\0' signalant la fin de la chaîne du coup le strcat() suivant va planter.
Et si tu te dis "oui mais j'ai mis memset() à 0 avant" j'expliquerais après pourquoi tes memset() sont faux.
Bon après j'ai viré ton thread pendant le portage vu qu'il est totalement inutile, donc je ne sais pas si cette partie est buggée ou non.
Valgrind m'indique des problèmes dans ton parser mais il est un "peu" trop bordélique pour que je m'y penche.

Donc venons aux erreurs "pas grave mais presque" :
il faut utiliser sizeof() avec des tableaux que s'ils ne sont pas dynamiques, ce qui fait que rech = (CHAR *) malloc (len_argv1 + 1);
memset (rech, 0, sizeof (rech));
c'est faux car le sizeof() d'un pointeur c'est 4 (sur une architecture 32 bits). Donc tes memset() ne vont mettre à 0 que 4 octets.

Quelques conseils :
si tu veux vraiment mettre à 0 ta chaine allouée : utilise calloc() qui va le faire très bien (ça va malloc + memset). si tu veux dupliquer une chaine utilise strdup() qui malloc() + strcpy(). Lorsque tu veux copier une chaine n'utilise pas memcpy() mais strcpy() et tu n'auras pas à mettre le '\0' de fin de chaine manuellement. Si tu veux comparer des chaines, ne fait pas caractère par caractère dans un if, utilise strcmp() ou strncmp().

Si tu veux faire une chaine directement intialisée et dans laquelle tu ne copieras pas de données, ne fait pas : char begin[1000] = "GET /search?q="; qui gaspille la mémoire mais tout simplement char begin[] = "GET /search?q="; le compilo mettra la taille tout seul comme un grand.
Ne met pas plein de variables globales ! Les variables globales c'est mal ! Du moins en abuser c'est mal.
Ne déclare pas n'importe où tes variables, en C elles ont des places bien définies pour une portée qui est aussi bien définie donc c'est soit en début de fichier, soit en début de fonction, soit en début de bloc mais pas en plein milieux d'un bloc (cas de wsaData dans ton main).
Pour finir n'utilise pas des threads si elles ne servent à rien, si tu lances un thread c'est pour continuer ensuite l'exécution et non pour attendre qu'il se finisse pour ensuite continuer l'exécution.

Derniers conseils (plus larges) : use et abuse des pages de manuels (surtout qu'elles sont meme en français), passe à linux pour pouvoir utiliser valgrind par exemple, il te permettra de vérifier que ton programme fonctionne correctement sans des bugs cachés.
J'espère que tu n'as pas mal pris mes remarques/conseils/corrections et que tu vas nous mettre à jour ce code par une nouvelle version toute propre et exempte de bugs.
Je te souhaite bon code.
Enjoy,
Thaeron
Afficher les 9 commentaires