Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1089 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Brûlons strncpy ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Brûlons strncpy ?

n°997120
Taz
bisounours-codeur
Posté le 01-03-2005 à 14:17:15  profilanswer
 

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
mood
Publicité
Posté le 01-03-2005 à 14:17:15  profilanswer
 

n°997130
Sve@r
Posté le 01-03-2005 à 14:23:46  profilanswer
 

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.
n°997141
nraynaud
lol
Posté le 01-03-2005 à 14:27:25  profilanswer
 

[:nraynaud]


---------------
trainoo.com, c'est fini
n°997142
Taz
bisounours-codeur
Posté le 01-03-2005 à 14:27:40  profilanswer
 

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 ?

n°997143
Lam's
Profil: bas.
Posté le 01-03-2005 à 14:27:50  profilanswer
 

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
 

n°997145
Taz
bisounours-codeur
Posté le 01-03-2005 à 14:28:44  profilanswer
 

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

n°997166
Lam's
Profil: bas.
Posté le 01-03-2005 à 14:36:31  profilanswer
 

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).

n°997169
Sve@r
Posté le 01-03-2005 à 14:39:12  profilanswer
 

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.
n°997174
Taz
bisounours-codeur
Posté le 01-03-2005 à 14:41:37  profilanswer
 

depuis quand le C ne fait plus confiance au programmeur ?

n°997178
++fab
victime du syndrome IH
Posté le 01-03-2005 à 14:43:04  profilanswer
 

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

mood
Publicité
Posté le 01-03-2005 à 14:43:04  profilanswer
 

n°997209
nraynaud
lol
Posté le 01-03-2005 à 15:05:16  profilanswer
 

Sve@r a écrit :

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


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


---------------
trainoo.com, c'est fini
n°997242
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-03-2005 à 15:33:44  profilanswer
 

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/
n°997272
Sve@r
Posté le 01-03-2005 à 15:55:17  profilanswer
 


 
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.
n°997279
Sve@r
Posté le 01-03-2005 à 15:59:53  profilanswer
 

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.
n°997284
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-03-2005 à 16:01:49  profilanswer
 

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/
n°997289
Taz
bisounours-codeur
Posté le 01-03-2005 à 16:03:51  profilanswer
 

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à ?

n°997293
Taz
bisounours-codeur
Posté le 01-03-2005 à 16:06:21  profilanswer
 

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

n°997303
Sve@r
Posté le 01-03-2005 à 16:11:51  profilanswer
 

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.
n°997391
chrisbk
-
Posté le 01-03-2005 à 18:06:52  profilanswer
 

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 ?

n°997398
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-03-2005 à 18:18:24  profilanswer
 

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/
n°997421
HelloWorld
Salut tout le monde!
Posté le 01-03-2005 à 19:19:02  profilanswer
 
n°997422
Lam's
Profil: bas.
Posté le 01-03-2005 à 19:20:40  profilanswer
 

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

n°997426
HelloWorld
Salut tout le monde!
Posté le 01-03-2005 à 19:25:46  profilanswer
 

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
n°997442
Kristoph
Posté le 01-03-2005 à 19:44:06  profilanswer
 

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

n°997554
Sve@r
Posté le 01-03-2005 à 21:14:57  profilanswer
 

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.
n°998405
blackgodde​ss
vive le troll !
Posté le 02-03-2005 à 15:51:09  profilanswer
 

...


---------------
-( BlackGoddess )-
n°998467
Kristoph
Posté le 02-03-2005 à 16:56:28  profilanswer
 

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.

n°998657
Sve@r
Posté le 02-03-2005 à 20:19:33  profilanswer
 

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.
n°998681
Taz
bisounours-codeur
Posté le 02-03-2005 à 20:39:39  profilanswer
 

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

n°998704
Sve@r
Posté le 02-03-2005 à 21:11:17  profilanswer
 

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.
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Brûlons strncpy ?

 

Sujets relatifs
[C / GNU] petit doute sur strncpy 
Plus de sujets relatifs à : Brûlons strncpy ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR