3 votes

Cette fonction peut-elle être conforme à deux versions de POSIX ?

Voici le synopsis de strspn :

#include <string.h>

size_t strspn(const char *s1, const char *s2);

Il s'agit de la description et de la valeur de retour pour POSIX.1-2001 :

La fonction strspn() calcule la longueur (en octets) du segment initial maximal de la chaîne de caractères désignée par s1 qui est entièrement constitué d'octets de la chaîne de caractères désignée par s2.

La fonction strspn() renvoie l'information suivante longueur de s1 ; aucune valeur de retour n'est réservée pour indiquer une erreur.

C'est (presque) la même chose que dans POSIX.1-2017 :

La fonction strspn() calcule la longueur (en octets) du segment initial maximal de la chaîne de caractères désignée par s1 qui est entièrement constitué d'octets de la chaîne de caractères désignée par s2.

La fonction strspn() renvoie l'information suivante longueur calculée ; aucune valeur de retour n'est réservée pour indiquer une erreur.

Est-il possible qu'une implémentation de strspn pour être conforme à la fois à POSIX.1-2001 et à POSIX.1-2017 ? Comment ?

8voto

melpomene Points 5675

Il s'agit d'un bogue dans POSIX.1-2001.

En tant que la description POSIX de strspn dit :

La fonctionnalité décrite dans cette page de référence est alignée sur la norme ISO C. Tout conflit entre les exigences décrites ici et la norme ISO C est involontaire. Le présent volume de la norme IEEE 1003.1-2001 s'en remet à la norme ISO C.

Et la norme C (ISO 9899:1999, 7.21.5.6 En strspn fonction ) dit clairement :

En strspn renvoie la longueur du segment.

Les éditions plus récentes de POSIX ont corrigé la formulation pour qu'elle dise la même chose que la norme C, ce qui a toujours été l'intention. (Cela a apparemment été remarqué et modifié en 2006 ; voir https://www.opengroup.org/austin/docs/austin_330.txt . Les version actuelle de strspn dans POSIX se réfère à cela (de manière plutôt cryptique) comme " SD5-XSH-ERN-182 est appliqué "dans la section HISTORIQUE DES CHANGEMENTS).

Comme POSIX dit qu'il "s'en remet à la norme ISO C", je pense que les implémentations conformes doivent suivre la norme C en cas de conflit, comme c'est le cas ici.

4voto

Deduplicator Points 9096

Sí, el longueur calculée et le longueur de s1 diffèrent souvent, ce qui signifie que la fonction doit violer l'une de ces descriptions.

Mais le premier est manifestement un erreur dans le libellé comme ce dernier devait être signifié, donc cela n'a pas d'importance .

Peu nombreux sont ceux qui pourraient affirmer que strspn() a été conçue comme une imitation encombrante et bon marché de la strlen() avec un visage impassible.

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