Est-ce un comportement indéfini de rejeter la constance d’un paramètre de fonction?

Imaginez que j’ai cette fonction C (et le prototype correspondant dans un fichier d’en-tête)

void clearssortingng(const char *data) { char *dst = (char *)data; *dst = 0; } 

Existe-t-il un comportement indéfini dans le code ci-dessus, renvoyant le const , ou s’agit-il simplement d’une pratique de programmation terriblement mauvaise?

Supposons qu’il n’y ait pas d’objects qualifiés de const

 char name[] = "pmg"; clearssortingng(name); 

    La tentative d’écriture sur *dst est UB si l’appelant vous transmet un pointeur sur un object const ou un pointeur sur un littéral de chaîne.

    Mais si l’appelant vous transmet un pointeur sur des données qui sont en fait mutables, le comportement est défini. Créer un caractère const char* qui pointe sur un caractère modifiable ne rend pas ce caractère immuable.

    Alors:

     char c; clearssortingng(&c); // OK, sets c to 0 char *p = malloc(100); if (p) { clearssortingng(p); // OK, p now points to an empty ssortingng free(p); } const char d = 0; clearssortingng(&d); // UB clearssortingng("foo"); // UB 

    C’est-à-dire que votre fonction est extrêmement mal conseillée, car il est si facile pour un appelant de provoquer UB. Mais il est en fait possible de l’utiliser avec un comportement défini.

    Considérons une fonction comme strstr qui, si on lui donne un pointeur sur une partie d’un object contenant une chaîne, renvoie un pointeur sur une partie éventuellement différente du même object. Si la méthode reçoit un pointeur sur une zone mémoire en lecture seule, elle renvoie un pointeur sur une zone mémoire en lecture seule. De même, si on lui atsortingbue un pointeur sur une zone inscriptible, il renverra un pointeur sur une zone inscriptible.

    Il n’ya aucun moyen en C d’obliger une fonction à renvoyer un caractère const char * lorsque un caractère const char * est atsortingbué, et à renvoyer un caractère ordinaire char * à un caractère char * ordinaire. Afin d’être compatible avec le fonctionnement de strstr avant que l’idée d’un const char * soit ajoutée au langage, il faut convertir un pointeur qualifié de const en un pointeur non qualifié de const. S’il est vrai qu’en tant que fonction de bibliothèque, strstr peut être autorisé à effectuer un tel strstr même si le code utilisateur ne le peut pas, le même modèle apparaît suffisamment souvent dans le code utilisateur pour qu’il soit pratique de l’interdire.