2011-03-26 3 views
3

J'écris un algorithme qui détecte les clones dans le code source. Par exemple. s'il y a un bloc comme:Algorithme de détection de clones

for(int i = o; i <5; i++){ 
doSomething(abc); 
} 

... et si ce bloc est répété ailleurs dans le code source, il sera détecté comme un clone. La méthode que j'utilise actuellement consiste à créer des hachages pour les lignes/blocs et à les comparer avec des hachages d'autres lignes/blocs dans la même source pour voir s'il y a des correspondances. Maintenant, si le même bloc que ci-dessus devait être répété quelque part avec seulement l'argument de quelque chose de différent, il ne serait pas détecté comme un clone même si cela ressemblerait beaucoup à un clone pour vous et moi. Mon algorithme détecte les correspondances exactes mais ne détecte pas les blocs correspondants où seul l'argument est différent.

Quelqu'un pourrait-il suggérer des moyens de contourner ce problème? Merci!

+0

... euhh, juste curieux mais ... pourquoi voulez-vous faire ça? – quasiverse

+1

Ce lien vous aidera probablement: http://stackoverflow.com/questions/5294447/how-can-i-find-source-code-copying Bien que ce soit C++, un logiciel qui peut être utilisé dans différentes langues a été fourni. –

+0

@quasiverse: J'imagine pour le refactoring? –

Répondre

3

Voici un moyen très simple, qui peut aller trop loin dans l'effacement d'informations (c'est-à-dire qui peut produire trop de faux positifs): remplacer tout identificateur qui n'est pas un mot clé par un nom fixe. Donc, vous obtiendrez

for (int DUMMY = DUMMY; DUMMY<5; DUMMY++) { 
    DUMMY(DUMMY); 
} 

(en supposant que vous vouliez dire vraiment o plutôt que 0 dans la partie d'initialisation du for -loop). Si vous obtenez un grand nombre de faux positifs, vous pouvez ensuite les post-traiter en cherchant, par exemple, à voir quelle fraction des DUMMY correspond réellement au même identifiant dans les deux moitiés de la correspondance, ou au moins aux identifiants qui sont cohérents entre les deux.

Pour faire beaucoup mieux, vous aurez probablement besoin d'analyser le code dans une certaine mesure. Ce serait beaucoup plus de travail.

+0

Ceci + coupez et supprimez les nouvelles lignes et vous êtes sur le chemin pour trouver des dupes. – stefan

+0

Yo placerait probablement la variable de boucle dans un autre ensemble (c'est-à-dire DUMMY1) car elle est initialisée à l'intérieur de ce bloc. –

+0

Oups, je voulais dire 0. Je pense que c'est une bonne idée ... Je crains que cela ne marque pas correctement les clones bien que par exemple. Si un groupe de lignes n'avait pas de mots-clés, ils seraient détectés comme des clones. – LadyMadonna234

0

Eh bien, si vous allez faire autre chose, alors vous devrez analyser au moins un peu. Par exemple, vous pouvez détecter les méthodes, puis ignorer les arguments de la méthode dans votre hachage. Quoi qu'il en soit, je pense qu'il est toujours vrai que vous avez besoin de votre programme pour mieux comprendre le code que «juste des blocs de texte», et cela pourrait être terriblement compliqué.

Questions connexes