Utilisation de char non signé * avec des méthodes de chaîne telles que strcpy

Je me suis maintenant rappelé à certains endroits de mon code que j’avais peut-être transmis unsigned char* variables strcpy unsigned char* tant que parameters à des fonctions telles que strcpy et strtok – qui attendent char * . Ma question est: est-ce une mauvaise idée? Cela aurait-il pu causer des problèmes?

par exemple

 unsigned char * x = // .... some val, null terminated unsigned char * y = // ... same here; strcpy(x,y); // ps assuming there is space allocated for x 

par exemple, caractère unsigned char * x = strtok(NULL,...)

Il est garanti que tout va bien (après le lancement du pointeur), car la “règle d’alias ssortingcte” comporte une exception spéciale permettant de regarder le même object via unsigned variantes unsigned et unsigned .

Voir ici pour la règle elle-même. D’autres réponses sur cette page l’expliquent.

Les règles de repliement de l’algorithme ont des exceptions pour les variantes signées / non signées et pour l’access aux caractères en général. Donc pas de problème ici.
Citation de la norme:

Un object doit avoir sa valeur stockée accessible uniquement par une expression lvalue qui possède l’un des types suivants: 88)
– un type compatible avec le type effectif de l’object,
– une version qualifiée d’un type compatible avec le type effectif de l’object,
– un type qui est le type signé ou non signé correspondant au type effectif de l’object,
– un type qui est le type signé ou non signé correspondant à une version qualifiée du type effectif de l’object,
– un type d’agrégat ou d’union qui inclut l’un des types mentionnés ci-dessus parmi ses membres (y compris, de manière récursive, un membre d’une union sous-agrégée ou confinée), ou
– un type de caractère.

Toutes les fonctions de bibliothèque standard traitent tous les arguments de caractère comme des caractères unsigned char . Par conséquent, le fait de passer char* , unsigned char* ou signed char* est traité de la même manière.
Citation de l’intro de :

Pour toutes les fonctions de ce sous-paragraphe, chaque caractère doit être interprété comme s’il contenait le type unsigned char (et donc chaque représentation d’object possible est valide et a une valeur différente).

Néanmoins, votre compilateur devrait se plaindre si vous obtenez une erreur de signature, surtout si vous activez tous les avertissements (vous devriez, toujours).

Le seul problème avec la conversion de unsigned char * en char * (ou vice versa) est qu’il est supposé être une erreur. Fixez-le avec un casting.

par exemple,

function((char *) buff, len);

Ceci étant dit, strcpy doit avoir le caractère de fin de strcpy ( \0 ) pour fonctionner correctement. L’alternative est d’utiliser memcpy .

Mais vous ne devriez pas utiliser de tableaux de caractères unsigned char avec des fonctions de gestion de chaînes. En C, les chaînes sont des tableaux de caractères et non des tableaux de caractères non signés. Comme le passage à strcpy ignore le qualificatif non signé, le compilateur en avertit.

En règle générale, ne faites pas des choses non signées quand vous n’avez pas à le faire.