Titre: [C/C++] sockets et strcat() Posté par: lilxam le 26 Janvier 2007 à 20:48:11 Bonjout tout le monde. Bon voilà j'ai deux questions en C/C++.
La premiere, je ne trouve pas comment executer une commande MS-DOS à partir du client sur le serveur avec les sockets. Un peu comme avec netcat l'option -e. La seconde, j'ai quelques probleme avec la fonction strcat() que je n'arrive pas à résoudre. Avec ce code tout marche : char chaine1[100] = "hello"; char chaine2[] = " world"; strcat (chaine1, chaine2); cout <<"Chaine1 : " <<chaine1; Parcontre, si je définis les chaines autrement j'obtient des resultats pas très convaiquant... Code : char chaine1[]=""; cout <<"chaine1 : "; cin >> chaine1; char chaine2[]=""; cout <<"chaine2 : "; cin >> chaine2; strcat(chaine1, chaine2); cout <<"resultat : "<<chaine1; Et là ...le resultat me renvoi un peu n'importe quoi, les caracteres pas dans l'ordre par exemple. Donc voici mes deux problemes, j'espère avoir été clair. Titre: [C/C++] sockets et strcat() Posté par: _o_ le 27 Janvier 2007 à 00:33:50 Citation de: lilxam [SNIP] Tu as du bol. Sur le linux que j'ai sous la main, c'est segmentation fault direct. Et pourquoi donc ? Rien à voir avec strcat : http://www.eskimo.com/~scs/cclass/notes/sx4aa.htmlchar chaine1[]=""; cout <<"chaine1 : "; cin >> chaine1; [SNIP] Et là ...le resultat me renvoi un peu n'importe quoi, les caracteres pas dans l'ordre par exemple. Citation if the dimension is omitted, it is inferred from the size of the string initializer. Autrement dit, la ligne char chaine1[]=""; ne fait qu'allouer un tableau de... 0 caractères (ou peut-être un quand même, pour loger le zéro teminal). Lorsque l'on tente de rentrer quelque chose là dedans, boum ! Un buffer overflow.Tu as juste la chance d'avoir un compilo ou un os assez laxiste qui ne le signale pas. Tu jardines donc joyeusement dans la mémoire avec tes saisies et ton strcat et le résultat est... imprévisible. Donc, un tableau de caractères statiques demande au moins une taille maximum. Et qui plus est, puisqu'on est sur NC, on n'oublie pas d'utiliser des fonctions de manipulations de chaîne robustes, pour éviter les buffer-overflows, soit, dans notre cas : strncat (méfiance avec ces trucs là, ça ne règle pas tous les problèmes, cf. le strncpy de la plupart des Unix, qui dans un cas particulier, omet le caractère terminal à la fin de la copie ! Un comble.) Quant à savoir comment limiter le nombre de caractères saisis sur le cin pour éviter de déborder les chaînes en paramètres, ça, je ne sais pas, je connais très peu le C++... (http://forum.hardware.fr/images/perso/spamafote.gif) Titre: [C/C++] sockets et strcat() Posté par: Invit le 27 Janvier 2007 à 02:45:12 On ne peut pas parser cin à priori, ça fait partie des choses à pas utiliser en général, enfin... D'un point de vue sécurité c'est complètement aléatoire en tout cas, au même titre qu'un gets (char *) en C.
Ca revient à se poser la question si on fait confiance aux données entrantes ou pas, en théorie jamais (et en théorie encore plus théorique, même pas au sein de tes propres fonctions dans ton programme, tu check tout le temps). Edith: Au temps pour moi, après recherche on peut parser cin avec les manipulateurs de iomanip http://cowww.epfl.ch/infgmel/miniref/miniref-flots.html Citation string code; Evidemment on parle en C++ là, en C on aura :cin >> setw(5) >> code; Lit uniquement 5 caractères. Code: char code[6]; // les données sont initialisées à 0 implicitement Titre: [C/C++] sockets et strcat() Posté par: neoflo le 27 Janvier 2007 à 10:37:21 Citation de: BufferBob char code[6]; // les données sont initialisées à 0 implicitement Ceci est faux. Le tableau est passé sur la pile (ce qui fait juste changer le pointeur de pile) mais n'initialises pas toutes les données sur la pile à 0.Code: #include <stdio.h> L'exécution me donne : Code: 2009118740 4013192 4013104 8 2009116333 Titre: [C/C++] sockets et strcat() Posté par: neoflo le 27 Janvier 2007 à 10:51:45 Chose amusante (mais ça peut vite changer) , le code :
Code: #include <stdio.h> Titre: [C/C++] sockets et strcat() Posté par: lilxam le 27 Janvier 2007 à 11:07:30 Ok merci pour vos réponses =)
Titre: [C/C++] sockets et strcat() Posté par: Invit le 27 Janvier 2007 à 14:22:52 Citation de: neoflo Ceci est faux. Le tableau est passé sur la pile (ce qui fait juste changer le pointeur de pile) mais n'initialises pas toutes les données sur la pile à 0. Ma foi, au temps pour moi (bis), je rectifie donc le code;Code: char code[6]; Code: char *code = (char *) calloc (6, sizeof (char)); // les données sont allouées dynamiquement (sur le tas), calloc() initialise à 0. |