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

37

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.

Tamara Wijsman
fuente
55
¿Es esto para una clase o algo así?
TheLQ
1
@TheLQ - Puedo pensar en más de un caso fuera de una sala de clase donde he ido a cazar para ver dónde se reutiliza "cortar y pegar, ¿verdad?" la brigada ha pasado.
MIA
No te olvides del Atomiq de Steve Smith .
Jim G.
Los comentarios y mensajes de salida (como errores, etc.) a menudo pueden codificar mejor el código de huellas digitales que el código real.
Bork Blatt
Siempre nos amenazaron con esto en Uni, sería interesante ver si tal herramienta realmente existía.
Jake

Respuestas:

10

Cuando enseñaba ingeniería de software, utilicé el servicio (gratuito) en Stanford llamado MOSS (Measure of Software Similarity). Esto me permitió detectar plagio entre proyectos de estudiantes muy fácilmente. El sistema también me permitió ingresar ejemplos de código de "bien conocido" que había usado durante la clase que debían ignorarse.

Lo mejor (un problema secundario) acerca de los resultados que se obtuvieron fue que pudimos determinar 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.

Peter K.
fuente
Gracias, estaba buscando algo exactamente así :)
Ulrich Dangel
8

Es posible que pueda utilizar la 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 del proyecto de origen sospechoso, podría ayudarlo a ver dónde se copió el código.

busyspin
fuente
sí, utilizamos el CPD de PMD en nuestro código
JoseK
Pero PMD es solo para Java, ¿verdad?
Janusz Lenar
5

Lo más cercano que sé de lo que estás 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.

epotter
fuente
4

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

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

Matthew Rodatus
fuente
(Gracias por el cumplido a mi herramienta). SmartDifferencer encuentra diferencias entre un par específico de archivos; la similitud es el complemento de las diferencias, por lo que estoy de acuerdo en que es una idea correcta. Pero requiere que identifique un par de archivos para darle, y eso es doloroso si sus sistemas consisten en muchos archivos. Lo que realmente se necesita es ese complemento: encontrar la similitud y hacerlo sin identificar personalmente pares de archivos. Vea mi respuesta CloneDR en este mismo hilo para tal herramienta. Sí, usa tecnología relacionada.
Ira Baxter
1

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.

Mason Wheeler
fuente
Si lo hiciera, SCO podría haber ganado contra IBM :-)
1

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.

Alan
fuente
1

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 buscar código editado con copiar y 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ódigo "equivalente" (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.

Ira Baxter
fuente
1

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).

Mar
fuente