Pourquoi strlen()
ne vérifie-t-il pas NULL?
si je fais strlen(NULL)
, les défauts de segmentation du programme.
Essayer de comprendre la raison d'être (le cas échéant).
Le rationnel derrière cela est simple - comment pouvez-vous vérifier la longueur de quelque chose qui n'existe pas?
De plus, contrairement aux "langues gérées", il n'y a aucune attente que le système d'exécution gère correctement les données ou les structures de données non valides. (Ce type de problème explique exactement pourquoi les langages plus "modernes" sont plus populaires pour les applications nécessitant moins de calcul ou moins performantes).
Un modèle standard en c ressemblerait à ceci
int someStrLen;
if (someStr != NULL) // or if (someStr)
someStrLen = strlen(someStr);
else
{
// handle error.
}
La partie du langage standard qui définit la bibliothèque de gestion des chaînes indique que, sauf indication contraire pour la fonction spécifique, tout argument de pointeur doit ont des valeurs valides.
La philosophie derrière la conception de la bibliothèque standard C est que le programmeur est finalement le mieux placé pour savoir si un contrôle d'exécution doit vraiment être effectué. À l'époque où la mémoire totale de votre système était mesurée en kilo-octets, la surcharge liée à l'exécution d'un contrôle d'exécution inutile pouvait être assez pénible. La bibliothèque standard C ne prend donc pas la peine de faire ces vérifications; il suppose que le programmeur l'a déjà fait si c'est vraiment nécessaire. Si vous savez vous ne passerez jamais une mauvaise valeur de pointeur à strlen
(comme, vous passez un littéral de chaîne, ou un tableau alloué localement), alors il n'est pas nécessaire d'encombrer le binaire résultant avec une vérification inutile contre NULL.
Une petite macro pour soulager votre chagrin:
#define strlens(s) (s==NULL?0:strlen(s))
La norme ne l'exige pas, donc les implémentations évitent simplement un test et potentiellement un saut coûteux.
size_t strlen ( const char * str );
http://www.cplusplus.com/reference/clibrary/cstring/strlen/
Strlen prend un pointeur sur un tableau de caractères comme paramètre, null n'est pas un argument valide pour cette fonction.
Trois raisons importantes:
La bibliothèque standard et le langage C sont conçus en supposant que le programmeur sait ce qu'il fait, donc un pointeur nul n'est pas traité comme un cas Edge, mais plutôt comme une erreur du programmeur qui se traduit par un comportement indéfini;
Cela engendre des frais supplémentaires d'exécution - appelant strlen
des milliers de fois et faisant toujours str != NULL
n'est pas raisonnable sauf si le programmeur est traité comme une poule mouillée;
Cela correspond à la taille du code - il ne peut s'agir que de quelques instructions, mais si vous adoptez ce principe et le faites partout, cela peut gonfler considérablement votre code.