[Je me fais un peu l'avocat du diable, mais je reste sur ma position et ne suis pas d'accord avec toi]
On peut discuter longuement de ce qu'on appelle "passer correctement" :)
Oui, enfin ca, suffit de lire le commentaire en dessous "ou equivalent" qui permet de penser que l'on peut aussi ecrire la chose suivante :
Le fait de passer par une variable n'est pas obligatoire. :)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 int my_strlen (chaine) { int return_value; if (chaine == NULL) { return_value = -1; } else { return_value = /* code qui calcule la longueur de la chaine */ } return return_value; }
Interessant. Tu es donc en train de dire qu'il vaut mieux obtenir un magnifique segfault au lieu d'agrandir le domaine de definition en pouvant retourner -1 ?
C'est un point de vue tres interessant, mais je ne suis pas certain que le client qui achete ton code soit de cet avis...
Tu fais bien de parler de norme.
C99 introduit (entre autre) snprintf, qui est exactement le contraire de ce que tu preconises.
C11 introduit le Bound-checking, c'est a dire la verification qu'une variable est dans sa plage de donnee
Il y a surement d'autres exemples du meme genre, mais je pense que tu vois ou je veux en venir : l'appelant peut tout a fait faire ces verifications a la place du compilateur, et pourtant l'evolution du langage tend vers ces doubles verifications.
Pour etre encore plus precis, strlen calcule le nombre de caracteres different de '\0' de la suite de char dont le premier est indique par le pointeur sur char passe en parametre - pointeur qui peut etre NULL.