2 votes

strlcpy : la source et la destination pointent vers le même objet

Je commence à peine à comprendre strlcpy .

size_t strlcpy(char *destination, const char *source, size_t size);

Ma question hypothétique est la suivante : que se passe-t-il si la destination et la source pointent vers le même objet ?

Exemple :

char destination[100];

const char*source = "text";

destination = source;

strlcpy(destination, source, sizeof(destination))

Que se passe-t-il dans le backend ?

Est strlcpy sachant que la source et la destination partagent le même pointeur ?

Ou

Est-ce qu'il recopie aveuglément et gaspille des cycles de CPU en recopiant les octets qui sont les mêmes ?

1voto

chux Points 13185

Que se passe-t-il si la destination et la source pointent vers le même objet ?

strlcpy() ne fait pas partie de la bibliothèque standard du langage C. Sa fonctionnalité précise peut varier d'un compilateur à l'autre. Consultez la documentation du compilateur/de la bibliothèque concerné(e) pour obtenir la meilleure réponse.

Dans le cadre des systèmes BSD, strlcpy(3) - Page de manuel Linux Je n'ai trouvé aucune disposition interdisant le chevauchement.


Depuis C99, le mot-clé restrict permet de répondre à la question "Que se passe-t-il si la destination et la source pointent vers le même objet ?

Si la signature est la suivante, il suffit d'utiliser destination, source qui font référence à des données qui se chevauchent est comportement non défini . Tout peut arriver.

size_t strlcpy(char * restrict destination, const char * restrict source, size_t size);

Si la signature est la suivante et que le compilateur est conforme à la norme C99 ou à une norme ultérieure, l'utilisation de destination, source qui peuvent se chevaucher est un comportement défini.

Si la signature est la suivante et que le compilateur n'est pas conforme à la norme C99 ou à une norme plus récente, l'utilisation de destination, source qui peuvent se chevaucher est susceptible comportement non défini à moins que la documentation ne traite de ce cas.

size_t strlcpy(char * destination, const char *source, size_t size);

0voto

Nico Gatti Points 1

strlcpy copiera la longueur du tampon et s'assurera que la chaîne est terminée par 0. Il ne vérifiera pas que votre dest et src sont les mêmes, c'est à vous de valider que les pointeurs visent la même adresse. Si ce n'est pas le cas, il réécrira les données et s'assurera que le dernier octet de la destination est un 0.

0voto

Nate Eldredge Points 2185

Desde strlcpy n'est pas défini par la norme ISO C ni par aucune autre norme "officielle" que je connaisse, il n'y a pas nécessairement de réponse canonique à cette question.

Le document le plus proche d'une spécification officielle pour cette fonction est probablement le document Page de manuel OpenBSD puisque la fonction a été introduite dans un papier co-écrit par Theo de Raadt, le créateur d'OpenBSD. (Le premier auteur de l'article est Todd C. Miller.) Cette page de manuel dit :

Si les chaînes src et dst se chevauchent, le comportement est indéfini.

En particulier, vous pouvez voir dans la source qu'avec cette mise en œuvre particulière, si vous deviez faire

char buf[20] = "hello world";
char *dest = buf+2;
strlcpy(dest, buf, 18);

puis dest finirait par pointer vers la chaîne de caractères "heheheheheheheheh" au lieu de "hello world" comme vous l'auriez probablement souhaité.

Puisque c'est le cas pour au moins une implémentation importante, vous seriez bien avisé de ne jamais appeler la fonction sur des chaînes de caractères qui pourraient se chevaucher, car votre code serait au moins moins moins portable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X