Brûlons strncpy ?

Brûlons strncpy ? - C - Programmation

Marsh Posté le 01-03-2005 à 14:17:15    

http://www.courtesan.com/todd/papers/strlcpy.html
 
J'avais jamais tilté que strncpy remplissait de 0 le reste de la chaine :/
aïe. Déjà qu'strncpy est pas facile à utiliser, mais alors là ...


Message édité par Taz le 01-03-2005 à 14:24:44
Reply

Marsh Posté le 01-03-2005 à 14:17:15   

Reply

Marsh Posté le 01-03-2005 à 14:23:46    

Taz a écrit :

http://www.courtesan.com/todd/papers/strlcpy.html
 
J'avais jamais tilté que strncpy remplissais de 0 le reste de la chaine :/
aïe. Déjà qu'strncpy est pas facile à utiliser, mais alors là ...


 
1) je ne suis pas certain que ce comportement soit standard (mais j'ai pas cherché quoi que ce soit qui traite de ce sujet)
2) je vois pas ce que ça change étant donné que, quand on manipule des chaînes, on s'arrête au premier '\0' rencontré et qu'on ne s'occupe pas du reste...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-03-2005 à 14:27:25    

[:nraynaud]


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 01-03-2005 à 14:27:40    

avec un t ?
 
1) si si, ça remplit de zero. strncpy écrit n caractères.
2) voir l'article. ça impacte sensiblement sur les performances. Tu le dis toi même, on ne s'occupe pas du reste, alors pourquoi ?

Reply

Marsh Posté le 01-03-2005 à 14:27:50    

Yup, mais ni linux ni windows n'ont strlcpy il me semble.
Sous windows, c'est strsafe.h qui est recommendé pas Microsoft.
     http://msdn.microsoft.com/library/ [...] ctions.asp
 

Reply

Marsh Posté le 01-03-2005 à 14:28:44    

ben t'as des choses comme la glib qui propose g_strlcpy

Reply

Marsh Posté le 01-03-2005 à 14:36:31    

Taz a écrit :

ben t'as des choses comme la glib qui propose g_strlcpy


Tiens, je savais pas qu'elles avaient été intégrées dedans... (d'un autre côté, vu que Monsieur glibc n'en veut pas, mais veut bien d'un truc calembouresque comme strfry, il fallait bien que ça aille quelque part).

Reply

Marsh Posté le 01-03-2005 à 14:39:12    

Taz a écrit :

avec un t ?
 
1) si si, ça remplit de zero. strncpy écrit n caractères.


Je vais vérifier ça de suite...
 

Taz a écrit :

2) voir l'article. ça impacte sensiblement sur les performances. Tu le dis toi même, on ne s'occupe pas du reste, alors pourquoi ?


Absolument aucune idée. Peut-être que c'est un truc comme "calloc" (que j'ai personnellement utilisé qu'une seule fois parce que j'avais la flemme d'initialiser).
Peut-être que c'est pour protéger le programmeur débile qui irait écraser accidentellement son '\0' => le suivant prend la relève
Peut-être que c'est pour éviter au programmeur qui veut rajouter un octet à sa chaîne de lui faire rajouter aussi le '\0' suivant.
Peut-être...
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-03-2005 à 14:41:37    

depuis quand le C ne fait plus confiance au programmeur ?

Reply

Marsh Posté le 01-03-2005 à 14:43:04    

quand le buffer de destination est trop grand : perte de performance
quand le buffer de destination est trop petit : mettre le \0 soit meme ...
----> buchet
avec pas mal de ses collegues de <string.h>, également complice dans le satanisme  :o

Reply

Marsh Posté le 01-03-2005 à 14:43:04   

Reply

Marsh Posté le 01-03-2005 à 15:05:16    

Sve@r a écrit :

Je vais vérifier ça de suite...


http://leconjugueur.com/php/newcon [...] be=remplir


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 01-03-2005 à 15:33:44    

Sve@r a écrit :

1) je ne suis pas certain que ce comportement soit standard (mais j'ai pas cherché quoi que ce soit qui traite de ce sujet)


C'est le comportement standard.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-03-2005 à 15:55:17    


 
Je parlais de vérifier le comportement de "strncpy", pas de vérifier la conjugaison du verbe "remplir". Mais j'apprécie le lien...
 
En effet, strncpy remplit le reste du buffer de '\0' (Emmanuel dit que c'est standard) alors que "strcpy" ne le fait pas. Pourquoi ? Boaf j'en sais rien (Emmanuel ?)
 
Un autre truc marrant de "strncpy", c'est que si la chaîne à copier est plus grande que la limite "n", la fonction ne met pas de '\0'.
Exemple: strncpy(dest, "1234567890", 5)
 
Voilà. C'était le quart-d'heure de "nos zauditeurs ont la parole"...
 
 
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-03-2005 à 15:59:53    

Taz a écrit :

depuis quand le C ne fait plus confiance au programmeur ?


 
Depuis que certains programmeurs ont des idées tordues comme "je stocke un int dans un char" ou "je fais du memcpy pour affecter un char"  :D  
 
Sans rire, maintenant que les machines sont 10000 fois plus rapides qu'en 1970, le C commence peut-être à vérifier qq trucs à la place du programmeur.
Et puis l'hypothèse du "cela permet de rajouter un caractère manuellement sans rajouter le '\0' suivant" est quand-même un petit-peu plausible...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-03-2005 à 16:01:49    

Sve@r a écrit :

En effet, strncpy remplit le reste du buffer de '\0' (Emmanuel dit que c'est standard) alors que "strcpy" ne le fait pas. Pourquoi ? Boaf j'en sais rien (Emmanuel ?)


Aucune idée. C'est pas moi qui ai écrit le C. Je me suis contenté un jour de télécharger la norme et d'en lire des bouts quand je suis sur le trône...
 
Un draft accessible très proche de C99 (pas strictement identique, mais seules les mouches soufffrent de ces différences...).  
 
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n869/
 
(Je suis scié. J'ai tapé 'n869' dans la fenetre de lien de Firefox, et il a trouvé ce répertoire directement en trois secondes...)


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-03-2005 à 16:03:51    

Sve@r a écrit :

Je parlais de vérifier le comportement de "strncpy", pas de vérifier la conjugaison du verbe "remplir". Mais j'apprécie le lien...
 
En effet, strncpy remplit le reste du buffer de '\0' (Emmanuel dit que c'est standard)


on me fait plus confiance ou quoi ?
 

Sve@r a écrit :

alors que "strcpy" ne le fait pas. Pourquoi ? Boaf j'en sais rien (Emmanuel ?)

tu voudrais que strcpy mettent des '\0' ?
 

Sve@r a écrit :


Un autre truc marrant de "strncpy", c'est que si la chaîne à copier est plus grande que la limite "n", la fonction ne met pas de '\0'.
Exemple: strncpy(dest, "1234567890", 5)

tu viens de te reveiller là ?

Reply

Marsh Posté le 01-03-2005 à 16:06:21    

Sve@r a écrit :

Sans rire, maintenant que les machines sont 10000 fois plus rapides qu'en 1970, le C commence peut-être à vérifier qq trucs à la place du programmeur.

sauf qu'on fait 10000 fois plus de choses avec.
 
Pas grand chose à voir, ca m'a fait bien marrer dans je sais plus qui (enfin si le créateur de C#) racontait qu'à l'époque de la limite des 640K sur pc, ils avaient des cycles de 1an, donc, après chaque version, ils recodaient tout depuis le départ :)

Reply

Marsh Posté le 01-03-2005 à 16:11:51    

Taz a écrit :

on me fait plus confiance ou quoi ?


La confiance n'exclut pas le contrôle. Mais je voulais surtout savoir si ça le faisais aussi chez-moi (j'utilise plusieurs systèmes)...
 

Taz a écrit :

tu voudrais que strcpy mettent des '\0' ?


Non, je disais juste que deux fonctions quasiment équivalentes ne font pas pareil. Je ne veux absolument rien et je suis déjà très heureux d'avoir mon '\0' final
 

Taz a écrit :

tu viens de te reveiller là ?


C'était au cas où certains zauditeurs ne l'auraient pas su...


Message édité par Sve@r le 01-03-2005 à 16:12:51

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-03-2005 à 18:06:52    

et si on brulait plutot le C pour ensuite s'enduire le corps de ses cendres avant d'aller forniquer comme des betes dans les bois ?

Reply

Marsh Posté le 01-03-2005 à 18:18:24    

chrisbk a écrit :

et si on brulait plutot le C pour ensuite s'enduire le corps de ses cendres avant d'aller forniquer comme des betes dans les bois ?


Par ce temps là, non merci !
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-03-2005 à 19:19:02    

Reply

Marsh Posté le 01-03-2005 à 19:20:40    

Lam's a écrit :

Yup, mais ni linux ni windows n'ont strlcpy il me semble.
Sous windows, c'est strsafe.h qui est recommendé pas Microsoft.
     http://msdn.microsoft.com/library/ [...] ctions.asp


 


Grillaid. :D

Reply

Marsh Posté le 01-03-2005 à 19:25:46    

Code :
  1. if ( strcmp( "http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/resources/strings/usingstrsafefunctions.asp",
  2. "http://www.microsoft.com/france/msdn/technologies/technos/securite/info/2004-06-02-secure03102004.html" ) == 0 )
  3. {
  4.     printf( "Grillaid.\n" );
  5. }
  6. else
  7. {
  8.     printf( ":p\n" );
  9. }


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 01-03-2005 à 19:44:06    

Sve@r a écrit :

Je parlais de vérifier le comportement de "strncpy", pas de vérifier la conjugaison du verbe "remplir". Mais j'apprécie le lien...
 
En effet, strncpy remplit le reste du buffer de '\0' (Emmanuel dit que c'est standard) alors que "strcpy" ne le fait pas. Pourquoi ? Boaf j'en sais rien (Emmanuel ?)
 
Un autre truc marrant de "strncpy", c'est que si la chaîne à copier est plus grande que la limite "n", la fonction ne met pas de '\0'.
Exemple: strncpy(dest, "1234567890", 5)
 
Voilà. C'était le quart-d'heure de "nos zauditeurs ont la parole"...


C'est très pratique en fait, si le dernier caractère de ton buffer de destination est un '\0', c'est que la copie n'a pas été interrompue par la taille de buffer trop réduite :D

Reply

Marsh Posté le 01-03-2005 à 21:14:57    

Kristoph a écrit :

C'est très pratique en fait, si le dernier caractère de ton buffer de destination est un '\0', c'est que la copie n'a pas été interrompue par la taille de buffer trop réduite :D


 
Oui, surtout si tu utilises "strlen()" pour trouver le dernier octet :D  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 02-03-2005 à 15:51:09    

...


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 02-03-2005 à 16:56:28    

Sve@r a écrit :

Oui, surtout si tu utilises "strlen()" pour trouver le dernier octet :D


Mauvaise langue. Je parle du dernier caractère de ton buffer. Vu que tu utilises strncpy, c'est que tu connais déjà quel est ce dernier caractère puisque tu passe la taille du buffer à la fonction.

Reply

Marsh Posté le 02-03-2005 à 20:19:33    

Kristoph a écrit :

Mauvaise langue. Je parle du dernier caractère de ton buffer. Vu que tu utilises strncpy, c'est que tu connais déjà quel est ce dernier caractère puisque tu passe la taille du buffer à la fonction.


 
Lol... j'avais compris mais c'était juste de l'humour...

Code :
  1. strncpy(dest, orig, 10);
  2. if (dest[10] == '\0')
  3.      printf("orig a moins de 10 octets - la preuve: %d\n", strlen(orig));
  4. else
  5.      printf("orig a plus de 10 octets - la preuve: %d\n", strlen(orig));

 :lol:  
 
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 02-03-2005 à 20:39:39    

je doute que le else s'affiche jamais ...

Reply

Marsh Posté le 02-03-2005 à 21:11:17    

Taz a écrit :

je doute que le else s'affiche jamais ...


memset(dest, 'x', 1000);
 
et voilà...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed