ti-enxame.com

Existem ferramentas para determinar a similaridade do código?

Não estou falando de uma ferramenta diff. Estou realmente procurando ver se um projeto contém código que pode ter sido "refatorado" de outro projeto. Seria provável que nomes de funções, nomes de variáveis ​​e outros enfeites fossem alterados. Os condicionais podem ser revertidos, etc.

37
siljoy

Quando eu estava ensinando engenharia de software, usei o serviço (gratuito) em Stanford chamou MOSS (Medida da similaridade de software).) Isso me permitiu detectar plágio entre projetos de alunos O sistema também me permitiu inserir exemplos de código "conhecidos" que eu havia usado durante as aulas que deveriam ser ignorados.

A grande coisa (completamente uma questão paralela) sobre os resultados retornados foi que poderíamos dizer quais alunos trabalharam juntos - mesmo que não tenham copiado descaradamente o código, eles discutiram os problemas o suficiente para que o código fosse semelhante. A parte triste foi encontrar o aluno estranho sem similaridade com qualquer outro código. Eles geralmente não se saíram tão bem.

10
Peter K.

Você pode usar o ferramenta PMD para encontrar o que está procurando. Destina-se a detectar recortar e colar em uma base de código, mas se você incluir a fonte suspeita do projeto Origin, poderá ajudá-lo a ver onde o código foi copiado.

8
busyspin

A coisa mais próxima que eu sei do que você está procurando é Clone Detective. É um plug-in do Visual Studio.

O Clone Detective é uma integração do Visual Studio que permite analisar projetos C # em busca de código-fonte duplicado em outro lugar. Ter duplicatas pode facilmente levar a inconsistências e, muitas vezes, é um indicador de código mal fatorado.

5
epotter

Parece que você deseja calcular a diferença entre duas árvores de sintaxe abstrata (AST), para que possa estar interessado no ferramenta Smart Differencer .

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

4
Matthew Rodatus

Mesmo se você não está falando sobre uma ferramenta diff, ainda pode usar uma para isso, pelo menos em certa medida. Se eu vir duas seções de código parecidas, por exemplo, colo ambas frequentemente no BeyondCompare para ver quanto trabalho seria simplificá-lo, refatorando a funcionalidade comum.

Por outro lado, se você não sabe onde está o código semelhante, mas está se perguntando se existe algum lugar em algum lugar ... o que está procurando? Uma ferramenta automatizada para detectar plágio? Não tenho certeza de que algo assim exista.

1
Mason Wheeler

Este artigo na wikipedia sobre o assunto também inclui links para várias ferramentas que podem ser usadas para encontrar código semelhante ou duplicado. Temos uma ferramenta interna para isso, por isso não estou familiarizado com as ferramentas externas mencionadas no artigo.

1
Alan

Eu realmente gosto de como CCFinderX visualiza a similaridade, então você pode querer verificar essa também. Suporta várias linguagens, é gratuito e é fácil de configurar (Python 2.6).

1
MaR

O que você realmente deseja fazer é ver se há um código clonado (copiado) nos dois projetos (ambos os projetos consistindo em conjuntos de arquivos possivelmente grandes). Você pode fazer isso executando uma ferramenta de detecção de clones. Wikipedia lista uma variedade deles.

Para decidir grosseiramente se há muitas cópias, você só precisa corresponder às linhas de origem e há uma variedade exata de detectores de clones de linha de origem por aí. Eu acredito que o PMD é um deles. O que isso não fará é encontrar o código que é copiado, colado e editado; eles encontrarão o código copiado e colado inalterado provavelmente contido no material copiado e editado.

Se você quiser ver os detalhes da cópia do código de copiar e editar, precisará de um detector de clone que encontre clones "parametrizados". Os detectores baseados em token fazem isso para edições que substituem apenas nomes ou constantes de variáveis.

Os detectores baseados em árvore de sintaxe abstrata (AST) fazem isso para edições que envolvem blocos maiores, como expressões, instruções, inserções, exclusões, etc. Esses últimos tendem a dar melhores respostas, porque, diferentemente dos detectores de token, eles podem usar a estrutura de linguagem do código-fonte do computador como um guia.

Nossa ferramenta CloneDR é um detector.

Não conheço ferramentas que encontrarão código "equivalente" (condicionais invertidos) etc. Os pesquisadores criaram detectores de clone que fazem algo parecido com isto, mas a combinatória torna isso muito caro para executar e os protótipos da pesquisa foram mal dimensionados.

1
Ira Baxter