2
votes

Effets secondaires: strcmp () est-il une fonction pure

J'apprends les effets secondaires et les fonctions pures . Je sais que les fonctions pures n'ont pas d'effets secondaires et que leur valeur de retour est la même pour les mêmes arguments. Je voudrais savoir si la fonction C strcmp () est une fonction pure. Je crois que c'est pur, car étant donné les deux mêmes chaînes comme paramètres, le résultat sera toujours le même. De plus, strcmp () ne modifie aucune variable ni n'appelle aucune fonction, il n'a donc aucun effet secondaire.

Cependant, je ne suis pas sûr que mon raisonnement soit correct.


4 commentaires

étant donné les deux mêmes chaînes que les paramètres vous ne donnez pas de chaînes, vous donnez des pointeurs.


@KamilCuk hmm, c'est intéressant. Si vous donnez les mêmes pointeurs à strcmp vous n'obtiendrez pas nécessairement le même résultat car il pourrait y avoir des données différentes à la fin de ceux-ci. Et si vous donnez des pointeurs vers les mêmes chaînes , ce n'est pas nécessairement la même entrée en termes de valeur pour strcmp .


Par exemple, le compilateur gcc a "const" et "pure" attribut de fonction . Dans cette description, memcmp pourrait être "pur", mais peut ne pas être "const". Les fonctions "const" ne peuvent pas accéder aux valeurs derrière les pointeurs.


@KamilCuk memcmp et strcmp ont les mêmes problèmes de "pureté", en ce sens qu'ils transmettent des pointeurs vers des données. Deux appels peuvent avoir les mêmes pointeurs, mais peuvent donner un résultat différent si les données vers lesquelles pointent les pointeurs ont changé entre les appels. Cela les rend, d'une certaine manière, impurs.


3 Réponses :


3
votes

strcmp () est une fonction pure, puisque le résultat dépend uniquement des paramètres et de plus, il ne modifie pas un état global.

Bien sûr, une mauvaise utilisation de strcmp () peut invoquer un comportement indéfini, mais ce n'est pas pertinent car il est pur ou impur.

Modifier:

Une fonction pure ne donne les mêmes résultats que lorsque la mémoire globale référencée est également la même. Les fonctions, qui ne nécessitent pas , sont appelées fonctions constantes .

La documentation de GCC fournit strlen () comme exemple de fonction pure. En effet, cette fonction prend un pointeur comme paramètre, et y accède pour trouver sa longueur. Cette fonction lit la mémoire globale (la mémoire pointée par les paramètres n'est pas considérée comme un paramètre), mais ne la modifie pas, et la valeur renvoyée dérive de la mémoire globale accédée.


0 commentaires

1
votes

Ce n'est pas pur, dans le sens où les arguments sont mutables. Cela signifie que le résultat de l'appel de strcmp (a, b) dépendra de ce vers quoi ces pointeurs pointent. La valeur renvoyée doit uniquement dépendre de la valeur des arguments.

Une autre exigence pour une fonction pure est qu'elle n'a pas d'effets secondaires. Ceci est accompli. Eh bien, en pratique, ça l'est. Cela dépend de la façon dont vous le voyez. Je peux presque promettre que toutes ses implémentations n'ont pas d'effets secondaires, mais la norme elle-même ne les oblige pas à avoir aucun effet secondaire.

En général, vous pouvez à toutes fins utiles supposer que cela n'a pas d'effets secondaires. La seule exception est si l'appel invoque un comportement indéfini, mais c'est quelque chose que vous devriez éviter de toute façon.

De plus, strcmp () ne modifie aucune variable ni n'appelle aucune fonction, il n'a donc aucun effet secondaire.

Vous ne pouvez pas dire avec certitude qu'il n'appelle aucune fonction. Ce sont les détails de mise en œuvre.


7 commentaires

Bien sûr, vous avez raison, mais si strcmp () faisait vraiment autre chose, c'est-à-dire modifiait un état global qui conduit à un comportement du programme différent de celui de l'implémentation pure, alors l'implémentation ne serait pas conforme au standard .


@Ctx Où puis-je lire dans la norme qu'elle ne serait pas conforme à la norme?


Ce n'est pas nécessaire. Il suffit de donner un exemple, où une version de strcmp () avec des effets secondaires conduirait à un comportement différent d'un programme par rapport à une version sans effets secondaires.


@Ctx Certaines fonctions modifient le errno global. Pour autant que je sache, il est parfaitement acceptable pour une implémentation d'ajouter un global supplémentaire pour des choses similaires.


Seulement si c'est documenté, ce qui n'est pas pour strcmp ()


@Ctx Oui, mais la norme dit-elle explicitement qu'une fonction modifiant de tels globaux viole la norme?


Si vous faites un strcmp () entre une fonction de modification d'errno et l'évaluation de l'errno, et que cet appel modifie errno, ce n'est bien sûr pas conforme au standard. S'il modifie un global, qui n'est utilisé nulle part et n'affecte donc pas le flux de code, je le considérerais toujours comme une fonction pure.



2
votes

Le comportement de strcmp () , comme celui de strlen () ne dépend que du contenu de la mémoire pointé par le const char * arguments. Aucun effet secondaire n'est censé se produire, et si les changements potentiels dans le système de gestion de la mémoire virtuelle sont considérés comme invisibles pour le programme, ils peuvent être considérés comme purs .

Notez cependant que la fonction étroitement liée strcoll () peut avoir des effets secondaires en fonction de l'implémentation de la gestion des paramètres régionaux, et ne doit pas être considérée comme pure.

De même, isdigit () est pur mais isalpha () ne l'est pas.


0 commentaires