L'utilisation de tels systèmes est courante dans de nombreuses universités. La plupart utilisent MOSS[1], qui a été développé à l'université de Stanford. Son fonctionnement[2] a été exploré dans une autre réponse par Michal Young. Je l'ai personnellement utilisé dans mon rôle d'assistant d'enseignement pour les cours de programmation. Vous pouvez y placer un tas de fichiers, et il vous sort des scores de similarité. Il ne s'agit pas d'un véritable système de détection du plagiat, et il n'est pas facturé comme tel.
Le problème avec MOSS est qu'il ne vérifie les similarités qu'au sein de la collection de code que vous lui donnez en pâture. Il ne fait pas de comparaison avec d'autres sources. Par exemple, il ne vérifie pas si le code a été copié depuis un endroit sur Internet. À plus petite échelle, disons que vous avez X années de devoirs soumis pour un cours et que vous voulez vérifier que personne ne copie les étudiants qui ont suivi le cours auparavant. Vous devriez introduire votre collection ENTIÈRE de code pour chaque requête que vous lancez. Cela peut devenir irréalisable.
Le système général le plus populaire pour la détection du plagiat est Turnitin[3]. Il vérifie les soumissions les unes par rapport aux autres, mais aussi par rapport à l'internet général, aux soumissions antérieures et à une collection de bases de données universitaires privées. Ce système est beaucoup plus efficace. Cependant, il est destiné à la création littéraire et aux essais, et ne fonctionne pas très bien pour le code, pour diverses raisons.
La plus élémentaire est que le code ne peut pas être évalué de la même manière que le texte. MOSS utilise la tokenisation suivie de la création de ngram[4], mais cette approche a ses propres problèmes qui ne sont pas triviaux. J'ai effectué quelques travaux de recherche dans le domaine du traitement du langage naturel dans un passé récent, j'en ai donc vu certains de première main. Je ne sais pas quel système votre université utilise, ni quelles sont ses méthodes, ses subtilités et ses bizarreries. Mais j'ai rencontré un système construit sur mesure avec les caractéristiques que vous décrivez.
Un de mes professeurs a créé un système qui utilise des techniques de compilation pour détecter le plagiat. C'est-à-dire qu'il ne regarde pas du tout le code réel. Il est complètement invariant du style et de la syntaxe, et regarde plutôt le résultat de la compilation ; c'est-à-dire qu'il regarde le fonctionnement du code. Selon moi, cette approche est celle qui a le plus de chances de fonctionner, en particulier si elle peut être associée à une vérification de type Turnitin sur l'Internet et d'autres collections. Je peux personnellement témoigner de l'efficacité de ce système, le professeur étant réputé pour attraper le plagiat.
Le principal problème avec un tel système est qu'il y a une forte possibilité de faux positifs. Un code dissemblable qui utilise des techniques similaires pour effectuer une tâche pourrait déclencher un avertissement. Un autre problème est que tous les langages et systèmes de programmation ne produisent pas un code intermédiaire ou compilé propice à cette technique. Troisièmement, différents langages de programmation peuvent être plus ou moins adaptés à ce type d'évaluation. Enfin, certains compilateurs peuvent utiliser des optimisations qui produisent différents types de code objet pour exactement le même code de haut niveau.
L'essentiel est que ce problème est ouvert et qu'aucune technique n'est parfaite. Cependant, il est définitivement possible de construire un système adéquat et viable pour détecter le plagiat dans le code. Il est également possible de tricher avec un tel système. J'ai pu le faire (pas dans le cadre d'un travail réel, mais en tant que tâche annexe, avec la pleine connaissance et la coopération du professeur). Je ne vais pas donner des astuces pour y parvenir, mais je dois dire que changer les noms des fonctions et des variables est une méthode extrêmement inadéquate et amateur.
Notes de bas de page
[1] Détection du plagiat[2] http://theory.stanford.edu/~aiken/publications/papers/sigmod03.pdf[3] Turnitin - Wikipedia[4] n-gram - Wikipedia