Forums - Tous les messages
Forums - Tous les messages
http://www.ybdesign.fr/index.php?option=com_content&task=view&id=26&Itemid=90
Pseudo : Pass : se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 
   Tous les messages

 Bas   Précédent   Suivant

(1) 2 3 4 ... 1517 »


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: 1876
Hors Ligne
super

Merci

Posté le : Hier 11:36
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: 1331
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 : Hier 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: 1876
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 : Hier 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: 1331
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 : Hier 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: 1876
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 : Hier 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:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1876
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 : Hier 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: P&E Multilink Universal FX BGND
Accro
Inscrit:
06/07/2007 09:17
Messages: 670
Hors Ligne
Salut.
Non, j'ai fait plein de test avec le support de PE... Retour SAV.

Posté le : Hier 9:45
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: 670
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 : Hier 9:42
Transférer la contribution vers d'autres applications Transférer


Re: P&E Multilink Universal FX BGND
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1876
Hors Ligne
Salut

As tu sauvé ton POD ?

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


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: 1876
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



 Haut
(1) 2 3 4 ... 1517 »




Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Forums - Tous les messages