web-dev-qa-db-fra.com

strlen ne vérifie pas NULL

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).

26
hari

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.
 }
31
Hogan

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.

19
John Bode

Une petite macro pour soulager votre chagrin:

#define strlens(s) (s==NULL?0:strlen(s))
5
Stoian Ivanov

La norme ne l'exige pas, donc les implémentations évitent simplement un test et potentiellement un saut coûteux.

5
ninjalj
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.

3
Casey Flynn

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.

2