11

Estoy buscando una forma automatizada para detectar cuándo se está copiando y pegando el código como parte del desarrollo en una gran base de código. Estamos trabajando principalmente en C++. La intención es detectar esto con alta probabilidad y pocos falsos positivos de manera automatizada, de modo que los cambios que hagan esto puedan rechazarse.¿Cómo automatizar la detección de código copiado en una gran base de código?

Es fácil para los desarrolladores temer lo desconocido de un código y en su lugar copiarlo para su uso y hacer un pequeño ajuste en lugar de trabajar en la copia maestra de una manera que funcione para todos. Quiero detectar y detener esos atajos que harán que el código sea más difícil de mantener.

¿Alguien puede sugerir una forma automatizada para tratar de detectar tales casos? ¿Puede aplicarse esto después del hecho para encontrar áreas que ya se han deslizado antes de la introducción de esta solución automatizada?

Respuesta

10

Simplemente use el paquete PMD. Es compatible con C++ y CPD configurable (copiar y pegar-Detección) ...

También permite la detección de mucho más:

  • código no utilizado
  • de codificación violaciónes de estilo
  • Método/función/tamaño de la rutina
  • estrecho acoplamiento

Y más (aunque muchos de los documentos son de Java específico, así que no estoy seguro exactamente w hat else aplicable a C++) ...

4

El profesor de Stanford, Alex Aiken, desarrolló una herramienta llamada MOSS (Measure of Software Similarity) que se utiliza para detectar el plagio en cursos de pregrado en varias universidades. La herramienta es muy buena para detectar piezas de código que son estructuralmente similares. No sé qué tan aplicable podría ser en su caso, pero podría valer la pena investigarlo.

1

Utilicé simian para groovy y java y resultó ser muy efectivo. Es compatible con una amplia configuración y muchos idiomas. Eche un vistazo al http://www.harukizaemon.com/simian/features.html. Es gratis para uso no comercial, le sugiero que explore usando la licencia de evaluación.

2

Consulte nuestro CloneDR, que está diseñado para automatizar la detección de clones en una amplia variedad de idiomas.

CloneDR se distingue de otros detectores de clones por:

  • utilizando la estructura/sintaxis del lenguaje como guía (ignora los espacios en blanco lenguaje y comentarios -> No se deje engañar por el diseño, en contraste con los comparadores de texto puro tal como detectores duplicados estilo Rabin-Karp
  • clones que detecta con variaciones paramétricas que consiste no sólo de variables o constantes, pero también estados enteros o bloques (en contraste con Token-estilo detectores)
  • proporcionar demostrablemente la más alta precisión ("pocos falsa positivos ") informando según un número o f documentos de investigación que comparan detectores de clonación

Existen versiones para C++ (Java, C#, ...), y puede ver ejemplos de informes en el sitio web. Puede descargar una versión de evaluación también.

Soy el autor.

1

Al usar nuestra herramienta SourceMeter obtienes un informe de texto sobre el código fuente duplicado (clones). Detecta los llamados clones de Tipo 2, que son estructuralmente muy similares, pero pueden diferir léxicamente. Los clones detectados son entidades sintácticas enteras (por ejemplo, funciones, bloques), por lo que pueden refactorizarse fácilmente, no puede suceder que un clon comience al final de una función y termine al comienzo de otra.

Otra característica importante que está buscando es que haga un seguimiento de las duplicaciones individuales en las versiones analizadas en el tiempo. De esa forma informa cuándo se crea una nueva duplicación o si una existente se elimina o cambia de manera incoherente.

Cuestiones relacionadas