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:
1943
![]() |
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/2017 10:48
|
|
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
|
||
![]() |
Re: sprintf sur une chaine qui n'a pas de caractère de fin |
||
---|---|---|
Accro
![]() ![]() Inscrit:
06/07/2007 09:17 Messages:
697
![]() |
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]
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
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.
Posté le : 21/08/2017 09:42
|
|
![]() |
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:
1943
![]() |
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/2017 10:06
|
|
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
|
||
![]() |
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:
1943
![]() |
Re salut
initialiser comme ca
char NomDuTruc[60] = {0};
Posté le : 21/08/2017 10:18
|
|
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
|
||
![]() |
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:
1354
![]() |
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/2017 10:58
|
|
![]() |
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:
1943
![]() |
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/2017 11:08
|
|
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
|
||
![]() |
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:
1354
![]() |
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/2017 11:19
|
|
![]() |
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:
1943
![]() |
super
Merci
Posté le : 21/08/2017 11:36
|
|
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
|
||
![]() |
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.