Existem ferramentas para determinar a similaridade do código? [fechadas]

37

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.

Tamara Wijsman
fonte
5
Isso é para uma aula ou algo assim?
TheLQ
11
@TheLQ - Posso pensar em mais de um caso fora de uma sala de aula onde eu fui caçar para ver onde o "recortar e colar é reutilizado, certo?" brigada passou.
MIA
Não se esqueça do Atomiq de Steve Smith .
Jim G.
Comentários e mensagens de saída (como erros etc.) geralmente podem ser melhores do que o código real.
Bork Blatt
Eles sempre nos ameaçaram com isso na Uni, seria interessante ver se essa ferramenta realmente existia.
Jake

Respostas:

10

Quando eu estava ensinando engenharia de software, usei o serviço (gratuito) em Stanford chamado MOSS (Medida de similaridade de software). Isso me permitiu detectar plágio entre projetos de alunos com muita facilidade. O sistema também me permitiu inserir exemplos de código "conhecidos" que eu havia usado durante a aula 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.

Peter K.
fonte
Obrigado, eu estava procurando algo exatamente assim :)
Ulrich Dangel
8

Você pode usar a 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 do projeto de origem suspeita, ela poderá ajudá-lo a ver onde o código foi copiado.

busyspin
fonte
sim - usamos o CPD de PMD no nosso código
Josek
Mas o PMD é apenas para Java, certo?
Janusz Lenar
5

A coisa mais próxima que eu sei do que você está procurando é o 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.

epotter
fonte
4

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

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

Matthew Rodatus
fonte
(Obrigado pelo elogio à minha ferramenta). O SmartDifferencer encontra diferenças entre um par específico de arquivos; A semelhança é o complemento das diferenças, por isso concordo que é a idéia certa. Mas exige que você identifique um par de arquivos para fornecê-lo, e isso é doloroso se o seu sistema consistir em muitos arquivos. O que é realmente necessário é esse complemento: encontre a semelhança e faça-o sem identificar pessoalmente os pares de arquivos. Veja minha resposta do CloneDR neste mesmo tópico para essa ferramenta. Sim, ele usa tecnologia relacionada.
perfil completo de Ira Baxter
1

Mesmo que você não esteja falando sobre uma ferramenta diff, você 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 ... o que está procurando? Uma ferramenta automatizada para detectar plágio? Não tenho certeza de que algo assim exista.

Mason Wheeler
fonte
Se o fizesse, SCO poderia ter vencido contra a IBM :-)
1

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.

Alan
fonte
1

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. A 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 realmente encontrem 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.

Ira Baxter
fonte
1

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

MaR
fonte