나는 diff 도구에 대해 이야기하고 있지 않습니다. 다른 프로젝트에서 "리팩토링 된"코드가 프로젝트에 포함되어 있는지 확인하려고합니다. 함수 이름, 변수 이름 및 변경되지 않은 것이있을 수 있습니다. 조건부 등이 반전 될 수 있습니다.
나는 diff 도구에 대해 이야기하고 있지 않습니다. 다른 프로젝트에서 "리팩토링 된"코드가 프로젝트에 포함되어 있는지 확인하려고합니다. 함수 이름, 변수 이름 및 변경되지 않은 것이있을 수 있습니다. 조건부 등이 반전 될 수 있습니다.
답변:
소프트웨어 엔지니어링을 가르 칠 때 스탠포드 에서 MOSS (소프트웨어 유사성 측정)라는 (무료) 서비스를 사용했습니다 . 이를 통해 학생 프로젝트 간의 표절을 매우 쉽게 감지 할 수있었습니다. 이 시스템을 통해 수업 중에 무시했던 "알려진"코드 예제를 입력 할 수있었습니다.
되돌아온 결과에 대한 가장 좋은 점은 (어떤 문제라도) 어떤 학생이 함께 일했는지 알 수 있었다는 것입니다. 슬픈 부분은 다른 코드와 유사하지 않은 이상한 학생을 찾는 것이 었습니다. 그들은 일반적으로 잘하지 않았다.
PMD 도구 를 사용하여 원하는 것을 찾을 수 있습니다. 코드 기반 내에서 잘라 내기 및 붙여 넣기를 감지하기위한 것이지만 의심되는 원본 프로젝트 소스를 포함하면 코드에서 코드를 복사 한 위치를 확인하는 데 도움이 될 수 있습니다.
두 개의 추상 구문 트리 (AST) 간 차이를 계산하려는 것처럼 들리므로 Smart Differencer 도구에 관심이있을 수 있습니다 .
https://stackoverflow.com/questions/974855/eclipse-abstract-syntax-tree-diff 에 있습니다 .
주제 에 대한 위키 백과 에 대한 이 기사 에는 유사하거나 중복 된 코드를 찾는 데 사용할 수있는 여러 도구에 대한 링크도 포함되어 있습니다. 이를위한 내부 도구가 있으므로 기사에서 언급 한 외부 도구에 익숙하지 않습니다.
실제로하고 싶은 것은 두 프로젝트 (두 개의 파일 세트로 구성된 프로젝트)에서 코드가 복제 (복사)되었는지 확인하는 것입니다. 복제 탐지 도구를 실행하여이를 수행 할 수 있습니다. Wikipedia 에는 다양한 목록이 있습니다.
복사가 많을 경우 총체적으로 결정하려면 소스 라인 만 일치하면되며 다양한 정확한 소스 라인 클론 검출기가 있습니다. PMD가 그중 하나라고 생각합니다. 이것들이하지 않는 것은 복사-붙여 넣기-편집 된 코드를 찾는 것입니다. 보일러 플레이트 복사-붙여 넣기-변경되지 않은 코드는 복사-붙여 넣기-편집 된 것들을 감쌀 것입니다.
copy-past-edit 코드 복사에 대한 세부 정보를 보려면 "매개 변수화 된"복제본을 찾는 복제 탐지기가 필요합니다. 토큰 기반 탐지기는 변수 이름이나 상수 만 바꾸는 편집을 위해이 작업을 수행합니다.
AST (Abstract-Syntax Tree) 기반 검출기는 표현식, 명령문, 삽입, 삭제 등과 같이 더 큰 청크와 관련된 편집에이 작업을 수행합니다. 토큰 검출기와 달리 컴퓨터 소스 코드의 언어 구조를 가이드로 사용할 수 있기 때문에 후자가 더 나은 답변을 제공하는 경향이 있습니다.
우리의 CloneDR 도구는 그러한 탐지기입니다.
실제로 "동등한"코드 (역 조건) 등을 찾을 수있는 도구를 모릅니다. 연구원들은 이와 같은 작업을 수행하는 복제 탐지기를 만들었지 만 조합 기술은이를 실행하는 데 비용이 많이 들고 연구 프로토 타입의 크기가 잘못되었습니다.
CCFinderX가 유사성을 시각화 하는 방법이 정말 마음에 듭니다 . 상당히 많은 언어를 지원하며 무료이며 설치가 매우 쉽습니다 (Python 2.6).