코드 유사성을 결정하는 도구가 있습니까? [닫은]


37

나는 diff 도구에 대해 이야기하고 있지 않습니다. 다른 프로젝트에서 "리팩토링 된"코드가 프로젝트에 포함되어 있는지 확인하려고합니다. 함수 이름, 변수 이름 및 변경되지 않은 것이있을 수 있습니다. 조건부 등이 반전 될 수 있습니다.


5
수업인가요?
TheLQ

1
@TheLQ-클래스 룸 환경 밖에서 "잘라내 기와 붙여 넣기가 재사용되는 곳"을 찾기 위해 사냥을 한 사례가 하나 이상 있다고 생각할 수 있습니까? 여단은지나 갔다.
MIA

Steve Smith의 Atomiq을 잊지 마십시오 .
Jim G.

주석 및 출력 메시지 (예 : 오류 등)는 실제 코드보다 지문 코드가 더 나은 경우가 많습니다.
Bork Blatt

그들은 항상 Uni에서 이것을 우리에게 위협했습니다. 그러한 도구가 실제로 존재하는지 보는 것은 흥미로울 것입니다.
Jake

답변:


10

소프트웨어 엔지니어링을 가르 칠 때 스탠포드 에서 MOSS (소프트웨어 유사성 측정)라는 (무료) 서비스를 사용했습니다 . 이를 통해 학생 프로젝트 간의 표절을 매우 쉽게 감지 할 수있었습니다. 이 시스템을 통해 수업 중에 무시했던 "알려진"코드 예제를 입력 할 수있었습니다.

되돌아온 결과에 대한 가장 좋은 점은 (어떤 문제라도) 어떤 학생이 함께 일했는지 알 수 있었다는 것입니다. 슬픈 부분은 다른 코드와 유사하지 않은 이상한 학생을 찾는 것이 었습니다. 그들은 일반적으로 잘하지 않았다.


고마워, 나는 정확히 같은 것을 찾고 있었다 :)
Ulrich Dangel

8

PMD 도구 를 사용하여 원하는 것을 찾을 수 있습니다. 코드 기반 내에서 잘라 내기 및 붙여 넣기를 감지하기위한 것이지만 의심되는 원본 프로젝트 소스를 포함하면 코드에서 코드를 복사 한 위치를 확인하는 데 도움이 될 수 있습니다.


yep-

그러나 PMD는 Java 전용입니다.
Janusz Lenar

5

내가 찾고있는 것에 가장 가까운 것은 클론 형사입니다. Visual Studio 플러그인입니다.

Clone Detective는 다른 곳에서 복제 된 소스 코드에 대한 C # 프로젝트를 분석 할 수있는 Visual Studio 통합입니다. 중복이 있으면 쉽게 불일치가 발생할 수 있으며 종종 팩토링이 잘못된 코드를 나타냅니다.


4

두 개의 추상 구문 트리 (AST) 간 차이를 계산하려는 것처럼 들리므로 Smart Differencer 도구에 관심이있을 수 있습니다 .

https://stackoverflow.com/questions/974855/eclipse-abstract-syntax-tree-diff있습니다 .


(내 도구에 대한 칭찬에 감사드립니다). SmartDifferencer는 특정 파일 쌍 사이의 차이점을 찾습니다. 유사성은 차이점을 보완하므로 올바른 아이디어라는 데 동의하지만 파일을 제공 할 파일 쌍을 식별해야하며 시스템이 많은 파일로 구성된 경우 고통 스럽습니다. 실제로 필요한 것은 보완입니다. 유사성을 찾아서 개인적으로 파일 쌍을 식별하지 않고 수행하십시오. 이러한 도구에 대한 동일한 스레드에서 내 CloneDR 답변을 참조하십시오. 예, 관련 기술을 사용합니다.
Ira Baxter

1

diff 도구에 대해 이야기하지 않더라도 적어도 어느 정도는 여전히 사용할 수 있습니다. 예를 들어, 비슷한 코드 섹션이 두 개 있으면 BeyondCompare에 자주 붙여 넣어 공통 기능을 리팩토링하여 단순화하는 것이 얼마나 많은지 알 수 있습니다.

반면에, 비슷한 코드가 어디에 있는지 모르지만 어딘가에 존재하는지 궁금하다면 ... 무엇을 찾고 있습니까? 표절을 탐지하는 자동화 된 도구? 그런 것이 있는지 확실하지 않습니다.


이 그랬다면, SCO는 :-) IBM에 대해 승리 할 수

1

주제 에 대한 위키 백과 에 대한 이 기사 에는 유사하거나 중복 된 코드를 찾는 데 사용할 수있는 여러 도구에 대한 링크도 포함되어 있습니다. 이를위한 내부 도구가 있으므로 기사에서 언급 한 외부 도구에 익숙하지 않습니다.


1

실제로하고 싶은 것은 두 프로젝트 (두 개의 파일 세트로 구성된 프로젝트)에서 코드가 복제 (복사)되었는지 확인하는 것입니다. 복제 탐지 도구를 실행하여이를 수행 할 수 있습니다. Wikipedia 에는 다양한 목록이 있습니다.

복사가 많을 경우 총체적으로 결정하려면 소스 라인 만 일치하면되며 다양한 정확한 소스 라인 클론 검출기가 있습니다. PMD가 그중 하나라고 생각합니다. 이것들이하지 않는 것은 복사-붙여 넣기-편집 된 코드를 찾는 것입니다. 보일러 플레이트 복사-붙여 넣기-변경되지 않은 코드는 복사-붙여 넣기-편집 된 것들을 감쌀 것입니다.

copy-past-edit 코드 복사에 대한 세부 정보를 보려면 "매개 변수화 된"복제본을 찾는 복제 탐지기가 필요합니다. 토큰 기반 탐지기는 변수 이름이나 상수 만 바꾸는 편집을 위해이 작업을 수행합니다.

AST (Abstract-Syntax Tree) 기반 검출기는 표현식, 명령문, 삽입, 삭제 등과 같이 더 큰 청크와 관련된 편집에이 작업을 수행합니다. 토큰 검출기와 달리 컴퓨터 소스 코드의 언어 구조를 가이드로 사용할 수 있기 때문에 후자가 더 나은 답변을 제공하는 경향이 있습니다.

우리의 CloneDR 도구는 그러한 탐지기입니다.

실제로 "동등한"코드 (역 조건) 등을 찾을 수있는 도구를 모릅니다. 연구원들은 이와 같은 작업을 수행하는 복제 탐지기를 만들었지 만 조합 기술은이를 실행하는 데 비용이 많이 들고 연구 프로토 타입의 크기가 잘못되었습니다.


1

CCFinderX가 유사성을 시각화 하는 방법이 정말 마음에 듭니다 . 상당히 많은 언어를 지원하며 무료이며 설치가 매우 쉽습니다 (Python 2.6).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.