it-swarm-es.com

¿Existen herramientas para determinar la similitud del código?

No estoy hablando de una herramienta diff. Realmente estoy buscando ver si un proyecto contiene código que puede haber sido "refactorizado" de otro proyecto. Es probable que los nombres de funciones, nombres de variables y demás se modifiquen. Los condicionales pueden ser revertidos, etc.

37
siljoy

Cuando estaba enseñando ingeniería de software, utilicé el servicio (gratuito) en Stanford llamado MOSS (Medida de similitud de software)). Esto me permitió detectar plagio entre los proyectos de los estudiantes muy fácilmente. El sistema también me permitió ingresar ejemplos de códigos "conocidos buenos" que había usado durante la clase que debían ignorarse.

Lo mejor (completamente un problema secundario) sobre los resultados que se obtuvieron fue que pudimos saber qué estudiantes trabajaron juntos --- incluso si no copiaron descaradamente el código, discutieron los problemas lo suficiente como para que su código fuera similar. La parte triste fue encontrar al extraño estudiante SIN SIMILARIDAD con ningún otro código. Por lo general, no les fue tan bien.

10
Peter K.

Es posible que pueda usar herramienta PMD para encontrar lo que está buscando. Está destinado a detectar cortar y pegar dentro de una base de código, pero si incluye la fuente sospechosa del proyecto Origin, podría ayudarlo a ver dónde se copió el código.

8
busyspin

Lo que más sé de lo que está buscando es Clone Detective. Es un complemento de Visual Studio.

Clone Detective es una integración de Visual Studio que le permite analizar proyectos de C # para el código fuente que está duplicado en otro lugar. Tener duplicados puede conducir fácilmente a inconsistencias y, a menudo, es un indicador de código mal factorizado.

5
epotter

Parece que desea calcular la diferencia entre dos árboles de sintaxis abstracta (AST), por lo que podría estar interesado en herramienta Smart Differencer .

Encontrado en https://stackoverflow.com/questions/974855/Eclipse-abstract-syntax-tree-diff .

4
Matthew Rodatus

Incluso si no estás hablando de una herramienta diff, puedes usar una para esto, al menos en cierta medida. Si veo dos secciones de código que se parecen, por ejemplo, frecuentemente pego ambas en BeyondCompare para ver cuánto trabajo sería simplificarlo refactorizando la funcionalidad común.

Por otro lado, si no sabe dónde está el código similar, pero se pregunta si existe en alguna parte ... ¿qué está buscando? ¿Una herramienta automatizada para detectar plagio? No estoy seguro de que tal cosa exista.

1
Mason Wheeler

Este artículo en wikipedia sobre el tema también incluye enlaces a varias herramientas que se pueden utilizar para encontrar código similar o duplicado. Tenemos una herramienta interna para esto, así que no estoy familiarizado con las herramientas externas mencionadas en el artículo.

1
Alan

Realmente me gusta cómo CCFinderX visualiza la similitud, por lo que es posible que desee verificar eso también. Admite varios idiomas, es gratuito y bastante fácil de configurar (Python 2.6).

1
MaR

Lo que realmente quiere hacer es ver si hay código clonado (copiado) en los dos proyectos (ambos proyectos que posiblemente contengan conjuntos de archivos posiblemente grandes). Puede hacerlo ejecutando una herramienta de detección de clones. Wikipedia enumera una variedad de ellos.

Para decidir groseramente si hay muchas copias, solo necesita hacer coincidir las líneas de origen, y hay una variedad de detectores de clones de línea de origen exactos. Creo que PMD es uno de ellos. Lo que estos no harán es encontrar el código que se edita copiar-pegar; encontrarán un código sin formato copia-pegar-sin cambios probablemente envuelto alrededor de las cosas copiadas y editadas.

Si desea ver los detalles de la copia del código copiar-editar-pasado, necesita un detector de clones que encuentre clones "parametrizados". Los detectores basados ​​en tokens hacen esto para ediciones que reemplazan solo nombres de variables o constantes.

Los detectores basados ​​en el árbol de sintaxis abstracta (AST) hacen esto para ediciones que involucran fragmentos más grandes, como expresiones, declaraciones, inserciones, eliminaciones, etc. Estos últimos tienden a dar mejores respuestas, porque a diferencia de los detectores de tokens, pueden usar la estructura del lenguaje del código fuente de la computadora como guía.

Nuestra herramienta CloneDR es un detector de este tipo.

No conozco herramientas que realmente encuentren códigos "equivalentes" (condicionales invertidos), etc. Los investigadores han construido detectores de clones que hacen algo como esto, pero la combinatoria hace que su ejecución sea muy costosa y los prototipos de investigación escalan mal.

1
Ira Baxter