Question

J'utilise la fonction Strlen de la bibliothèque C String. Je l'ai passé une chaîne nulle et j'ai trouvé un résultat mystérieux. Je sais que je ne suis pas censé passer une chaîne nulle mais j'ai besoin d'une explication pour cela.

main()
{
  int k;
  char *s=NULL;
  strlen(s);
  // k = strlen(s);
}

Sur mon compilateur GCC, il fonctionne bien avec le commentaire. Mais si vous supprimez le commentaire dans la lignek=strlen(s);

Il produit une défaut de segmentation. Une explication?

Était-ce utile?

La solution

Ceci est le code assembleur sans affectation à la variable int

movq    $0, -16(%rbp)
movl    $0, %eax
leave
ret

Le compilateur n'appelle pas _strlen car la valeur ne sera pas utilisée

Autres conseils

Le premier appel «strlen» qui n'attribue pas sa valeur de retour est probablement optimisé par votre compilateur.

Passer un pointeur nul vers strlen résulte en Behvaiour non défini. Tout peut arriver. Y compris les fauteurs de SEG. Et n'incluant pas de fauteurs SEG.

Si vous voulez connaître la raison exacte, vous devrez consulter le code de l'assembleur géré par votre compilateur. Mais cela ne vous dira rien d'utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top