sprintf sur une chaine qui n'a pas de caractère de fin [Forums - Langage C]
sprintf sur une chaine qui n'a pas de caractère de fin [Forums - Langage C]
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 

Parcourir ce sujet :   1 Utilisateur(s) anonymes





sprintf sur une chaine qui n'a pas de caractère de fin
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1893
Hors Ligne
Bonjour

Je suis en train de sécuriser une tache très importante et j'ai un sprintf qui m'interroge

Je fais ce sprintf
sprintf(&chaine[0], "blabla [%s]", &NomDuTruc[0]) ;


La chaine est une variable locale déclarée ainsi
char chaine[100] ;


et le paramètre du sprintf , la chaine NomDuTruc est une variable globale déclarée comme ça
char NomDuTruc[60] ;


Supposons que la chaine NomDuTruc soit mal initialisée, remplie que de 0, de 0xff ou de n'importe quoi sans caractères de fin, êtes vous d'accord que je risque de faire un sprintf sur plus que 60 caractères (le sprintf attendant de trouver un caractère de fin de chaine) ?

Pour sécuriser cela y a t-il une autre solution que de forcer un caractère de fin de chaine ainsi
[b]NomDuTruc[59] = '\0' ;
?[/b]

Merci

Posté le : 20/08 10:48
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: sprintf sur une chaine qui n'a pas de caractère de fin
Accro
Inscrit:
06/07/2007 09:17
Messages: 673
Hors Ligne
Salut Charly.

Avant de répondre sur la question, je voudrais faire une parenthèse sur le code suivant:
sprintf(&chaine[0], "blabla [%s]", &NomDuTruc[0]) ;


Sache que cette écriture
&chaine[0]
, est équivalente à celle-ci
chaine

Le nom du tableau est en fait un pointeur vers le premier élément du tableau.
Du coup tu peux re-écrire la fonction:
sprintf(chaine"blabla [%s]"NomDuTruc);


Si tu veux vraiment sécurité la chose, n'utilise pas de fonction std, il faut les re-écrire.
-Tu connais ou peux connaitre la taille de tes chaines, et donc la passer en paramètre.
-l'utilisation des const est conseillé sur les pointeurs ^^

Je te propose 2 exemples de prototypes
//prototype 1
Bool MySprintf(char * const pBuffer, const char * const pMyMessagechar * const pBuffer)

//prototype 2
Bool MySprintf(char BufferOut[], const char MyMessage[], char BufferIn[])


Pour revenir à ta supposition, le caractère de fin de chaine est '/0', est correspond au code hexa 0x00.
Si ta chaine est initialisé avec des 0x00, alors tu n'auras pas de problème.
char NomDuTruc[60] = {0};


Le pire cas tu tu peux avoir, c'est effectivement l’absence de '/0'.
C'est le jardinage garantie.

si tu veux faire rapide, utilise la fonction de recherche pour check la présence d'un '/0':
//Searches for the first occurrence of the character c (an unsigned char) in the string pointed to, by the argument str. 
char *strchr(const char *strint c)


Posté le : 21/08 09:42
Transférer la contribution vers d'autres applications Transférer


Re: sprintf sur une chaine qui n'a pas de caractère de fin
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1893
Hors Ligne
Salut

Merci, super ta réponse !
du coup je ne sais plus quoi faire moi ! solution rapide ou...oui, solution rapide ! là avec toutes les macros dans tous les sens du sdk je ferais des âneries...

Merci

Posté le : 21/08 10:06
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: sprintf sur une chaine qui n'a pas de caractère de fin
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1893
Hors Ligne
Re salut

initialiser comme ca
char NomDuTruc[60] = {0};
je ne sais pas faire puisque mon tableau est décrit dans un typedef d'une grosse structure et c'est en fait une varaible de ce typedef structure que je crée

Posté le : 21/08 10:18
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: sprintf sur une chaine qui n'a pas de caractère de fin
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1335
Hors Ligne
tu peux utiliser la fonction memset pour réinitialiser ton tableau avec des zéros à n'importe quel moment dans ton programme.

Posté le : 21/08 10:58
Transférer la contribution vers d'autres applications Transférer


Re: sprintf sur une chaine qui n'a pas de caractère de fin
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1893
Hors Ligne
Bonjour

J'initialise la chaine au boot avec memset avant de la charger avec ce qui est sensé être une valeur valide.

Mais mon soucis est que dans cette tache très importante que je veux sécuriser je suis sensé avoir une bonne valeur dans la chaine mais je n'en suis pas certain (de l'eau à coulé sous les ponts depuis les inits).
Et autant ça ne me gène pas d'avoir un drôle d'affichage si la chaine est corrompue, autant je ne veux pas que la tache soit plantée à cause de ca.

Le plus sûr est sans doute de forcer un 0 à la fin du tableau avant de sprintf. Comme ça je suis certain que ça ne plante pas et si le contenu est vérolé je verrai juste un affichage de caractères anormaux. si le contenu est valide, mon 0 ajouté ne servira à rien. Me trompe-je ?



Posté le : 21/08 11:08
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: sprintf sur une chaine qui n'a pas de caractère de fin
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1335
Hors Ligne
Non. Et le 0 que tu écris en fin de tableau ne risque pas non plus d'écraser quoi que ce soit d'utile puisque même la plus grande chaîne possible se terminerait par un 0.

Posté le : 21/08 11:19
Transférer la contribution vers d'autres applications Transférer


Re: sprintf sur une chaine qui n'a pas de caractère de fin
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1893
Hors Ligne
super

Merci

Posté le : 21/08 11:36
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

sprintf sur une chaine qui n'a pas de caractère de fin [Forums - Langage C]