En C, ce qui se passe exactement lorsque vous passez un pointeur NULL pour strcmp()?
J'ai lu que les résultats suivants dans un comportement indéfini.
strcmp(foo, NULL);
Mais qu'est-ce qui se passe "sous le capot" pour ainsi dire? Est foo
par rapport à la gestion des déchets de données? Est NULL
déréférencé? Quels sont les détails qui causent "un comportement indéfini"?
Qui a dit que la fonction est en panne?
Eh bien, vous pouvez toujours regarder la mise en œuvre du code source...
Le terme "comportement Indéfini" est volontairement vague parce que TOUT peut arriver. TOUT.
Un comportement indéfini signifie qu'il n'est pas indiqué ce qui doit arriver. Donc, l'opérateur peut décider de ce qu'ils se sentent le mieux. Le problème qu'il crée est que l'on ne peut pas se contenter de reproduire le comportement de l'un voit dans un système ou d'ailleurs même pas sur le même système, si les choses changent par exemple, le moteur d'exécution mis à jour ou que le programme est compilé de manière différente ou que le programme est exécuté dans des conditions différentes.
Dit "limité aux règles de la physique et de la logique". Écrit C... 🙂
Eh bien, vous pouvez toujours regarder la mise en œuvre du code source...
Le terme "comportement Indéfini" est volontairement vague parce que TOUT peut arriver. TOUT.
Un comportement indéfini signifie qu'il n'est pas indiqué ce qui doit arriver. Donc, l'opérateur peut décider de ce qu'ils se sentent le mieux. Le problème qu'il crée est que l'on ne peut pas se contenter de reproduire le comportement de l'un voit dans un système ou d'ailleurs même pas sur le même système, si les choses changent par exemple, le moteur d'exécution mis à jour ou que le programme est compilé de manière différente ou que le programme est exécuté dans des conditions différentes.
Dit "limité aux règles de la physique et de la logique". Écrit C... 🙂
OriginalL'auteur jfmercer | 2014-02-18
Vous devez vous connecter pour publier un commentaire.
Il dépend de la mise en œuvre, qui est libre d'assumer vos paramètres sont valides (c'est à dire pas null dans ce cas). Le comportement peut ou peut ne pas être reproductibles d'une exécution à l'exécution ou à partir d'une mise en œuvre/plate-forme à l'autre.
OriginalL'auteur justin
C11 très clair à ce sujet dans 7.1.4, "Utilisation des fonctions de la bibliothèque":
La description de
strcmp
dans 7.24.4 ne dit pas le contraire, si le comportement est en effet pas défini.OriginalL'auteur Kerrek SB
C'est la mise en œuvre actuelle de strcmp dans la glibc:
C'est en fait de répondre à la question. Dans la glibc, la valeur NULL est déréférencé et de tenter de comparer les "cordes" est fait, donc, en fonction de la façon dont le système répond à la tentative de lecture des adresses de mémoire 0,1,2..., l'erreur correspondante est produit, ou la chaîne est par rapport à la gestion des déchets de données.
Il ne répond pas à la question, parce que vous ne savez pas que la glibc est utilisé, et parce que vous admettre que, même lorsque la glibc est utilisé, ce qui se passe dépend de la façon dont le système hôte répond à une tentative de déréférencer un pointeur null.
Détail intéressant dans le code ici, en exploitant le fait que l'arithmétique modulaire normalement utilisé pour les types n'est pas utilisé pour le c1-c2 parce que le type de résultat est signé. Pour obtenir ce comportement, il faudrait écrire
return (unsigned char)(c1 - c2);
.OriginalL'auteur kobrien
Vous passez deux pointeurs, et strcmp déréférence leur contenu et se compare à ce qu'il respecte la différence ou le caractère null. L'échec se produit à différents niveau d'abstraction, strcmp est de ne pas la-gratuit sur son propre. De nombreux systèmes de générer SIGSEGV signsl sur un déréférencement de pointeur NULL, mais ce n'est pas l'exigence.
Veuillez noter que les normes ISO ne définissent pas beaucoup de choses, laissant les détails de mise en œuvre jusqu'à l'implémentation. ISO C niveau il n'y a rien de mal avec votre exemple, mais les résultats ne sont pas garantis d'être prévisible. (Et pas de test pratique est garanti pour être précis et reproductible, à moins que vous consultez les règles du système sous-jacent, et ils disent le contraire).
Lorsque nous parlons de niveaux d'abstraction, on ne peut pas demander "si", parce que les règles sont claires et dire "ne faites pas cela, le comportement n'est pas défini ici".
OriginalL'auteur user3125367