remodifier:
Pour disserter sur ma suggestion pour déterminer des fonctions identiques, le flux suivant peut être proposé:
Niveau 1: Retirez les espaces blancs qui ne fait pas partie d'une chaîne littérale; insérer des lignes après chaque {
, ;
et }
et comparer. Si égal; les fonctions sont identiques, sinon:
Niveau 2: Déplacer toutes les déclarations de variables et affectations qui ne dépendent pas de l'état d'autres variables définies dans la même portée au début de la portée dans laquelle elles sont déclarées (ou si ne voulant pas réellement analyser le JS, le début des accolades); et les commander par longueur de ligne; traiter tous les noms de variables comme étant de 4 caractères, et revenir à l'ordre alphabétique en ignorant les noms de variables en cas de longueurs liées. Réorganisez toutes les collections par ordre alphabétique et renommez toutes les variables vSNN
, où v est littéral, S le nombre d'accolades imbriquées et NN l'ordre dans lequel la variable a été rencontrée.
Comparer; en cas d'égalité, les fonctions sont identiques, sinon:
Niveau 3: Remplacer toutes les chaînes littérales avec "sNN"
, où "
et s
sont littérale et NN
est l'ordre dans lequel la chaîne a été rencontrée. Comparer; si égales, les fonctions sont identiques, sinon:
Niveau 4: Normaliser les noms de toutes les fonctions connues pour être identiques en utilisant le nom de la fonction ayant la priorité la plus élevée selon l'ordre alphabétique (dans l'exemple ci-dessous, les appels à p_strlen()
seraient remplacés par c_strlen()
Répéter ré-ordonnancements selon le niveau 1 si nécessaire comparer,.. en cas d'égalité, les fonctions sont identiques, sinon, les
fonctions sont presque certainement pas identiques. Réponse originale:
Je pense que vous trouverez que vous voulez dire "identique", pas "le même".
La différence, que vous trouverez, est essentiel:
Deux fonctions sont identiques si, suivant une certaine manière de la normalisation, (suppression des espaces non littérale, renommer et les variables de réordonnancement à un ordre normalisé, en remplaçant les littéraux de chaînes par des espaces réservés, ...) ils se comparent à littéralement égal.
Deux fonctions sont le même si, lorsqu'elles sont appelées pour une valeur d'entrée donnée, elles donnent la même valeur de retour. Considérons, dans le cas général, un langage de programmation qui a compté des chaînes terminées par zéro (chaînes hybrides Pascal/C, si vous voulez). Une fonction p_strlen(str)
peut regarder le nombre de caractères de la chaîne et retourner cela. Une fonction c_strlen(str)
peut compter le nombre de caractères dans la chaîne et renvoyer cela.
Bien que ces fonctions ne seront certainement pas identiques, elles seront les mêmes: Pour toute valeur d'entrée donnée (valide), elles donneront la même valeur.
Mon point est:
Détermination wether deux fonctions sont identiques (ce que vous semblez vouloir réaliser) est un (modérément) problème trivial, fait que vous décrivez.
Déterminer si deux fonctions sont vraiment les mêmes (ce que vous pourriez réellement vouloir réaliser) est non-trivial; en fait, c'est carrément dur, probablement lié au Halting Problem, et pas quelque chose qui peut être fait avec l'analyse statique.
Edit: Bien sûr, les fonctions qui sont identiques sont également les mêmes; mais d'une manière très spécifique et rarement utile pour une analyse complète.
Pour le niveau un, votre système ne fonctionnera pas tout le temps. Par exemple, 0011 est "identique" à 00011 mais la normalisation des espaces ne le verra pas; de même pour toutes les autres variantes "orthographes" de même valeur que ce soit le caractère, le nombre ou la chaîne. Pour JavaScript, vous devez également vous préoccuper des points-virgules "facultatifs". –