2009-12-15 2 views
4

중복 또는 유사한 C 코드를 기능으로 이동하는 것을 자동화하고 싶습니다.하나의 텍스트 파일이나 텍스트 파일에 중복 된 텍스트 나 유사한 텍스트 블록을 찾기위한 도구가 필요합니다.

이것은 Linux에서 작동해야합니다.

+0

나는 비슷한 코드 섹션을 식별하기위한 도구를 사용하는 것을지지합니다. 이러한 종류의 리팩터링을 자동화하면 문제가 발생합니다. – luke

+0

가능한 복제본 : http://stackoverflow.com/questions/546487/tools-to-identify-code-duplications –

+0

C++에서와 동일 : http://stackoverflow.com/questions/191614/how-to-detect-code- duplication-during-development –

답변

4

문제의 부분 집합 : 중복 된 코드를 탐지 :

시도 : PMD

중복 코드가 특히 큰 프로젝트에서 찾기 힘들 수 있습니다. 그러나 PMD의 CPD (복사/붙여 넣기 감지기)를 사용하면 쉽게 찾을 수 있습니다! CPD는 세 가지 주요 화신을 완료 한 것 :

  • 먼저 우리가 그런
  • 가 완전히 Burrows-를 사용 브라이언 Ewins에 의해 재 작성되었다 (우리의 변형이 여기에 설명되어 있습니다) 마이클 와이즈의 욕심 문자열 타일 알고리즘의 변형을 사용하여 작성 휠러 변환
  • 마지막으로 Karp-Rabin 문자열 일치 알고리즘을 사용하기 위해 Steve Hawkins가 다시 작성했습니다.

... CPD 자바, JSP, C, C++, 포트란 및 PHP 코드로 작동

참고.

+0

Java 코드에서 CPD를 사용하여 유사한 작업을 수행했습니다. 출력은 xml 일 수 있으므로 자동화가 쉽습니다. – vkraemer

1

당신은 Simian에서 살펴 봐야 할 것입니다. 비상업적 인 프로젝트에는 무료입니다. 다음과 같이 시도하십시오.

# Find all C source files and identify similarities/duplicate code. 
simian -includes=**/*.c -excludes=**/*_test.c 
+3

게시물의 코드 색상을 즐기고 있습니다. – Joe

+0

이 게시물의 링크가 깨졌습니다. :/ –

1

Simian (앞에서 언급 했음)이이를위한 좋은 도구입니다. 나는 내 프로젝트에 CloneDetective을 사용 해왔다. CloneDetective는 무료이므로 해보기가 어렵지 않습니다.

+0

C# 이외의 언어에서도 CloneDetective가 작동합니까? –

1

텍스트 줄을 비교할 수는 없습니다. 이 방식으로 코드를 구문 분석해야합니다. 의미 상 올바르지 만 다른 식별자를 가진 세그먼트를 감지 할 수도 있습니다.

예를 들어, 동일한 식별자이지만 다른 식별자를 사용하는 두 가지 함수가있는 경우 텍스트 검색은 해당 문자를 동일하게 표시하지 않지만 파서는 인식 할 수 있습니다.

문법이 주어 지더라도 C++ 파서를 작성하는 것은 쉬운 일이 아닙니다. 나는 다른 사람들의 충고를 권하고 이것을위한 도구를 찾는다. 또한 리팩토링 도구를 검색하십시오.

+0

Thomas는 정확합니다. 파서가 필요하고 파서를 만드는 것이 실제 언어를 배우기에는 꽤 어렵습니다. C 및 C++를 구문 분석하고 처리하는 복제 탐지 도구에 대한 CloneDR 응답을 참조하십시오. –

1

소스 코드에서 정확한 사본 및 니어 미스 (사본 붙여 넣기 편집) 복제본을 찾는 도구 인 CloneDR을 참조하십시오. 전체 언어 구문 분석기를 사용하여 언어 구조에 따라 복제본을 찾고 오탐 (false positive)을 최소화하고 코드가 주석 처리되거나 형식화 된 방식을 완벽하게 파악함으로써 진정한 탐지를 극대화합니다. CloneDR은 복제 된 블록이 가변적 인, 삽입 된 통계 또는 코드 블록을 변경했을 때 복제본을 찾습니다.

C, C++, COBOL, C#, Java, PHP 및 기타 여러 언어에 대한 언어 프런트 엔드가 있습니다.

웹 사이트에서 샘플 복제본 탐지 보고서를 볼 수 있습니다.

관련 문제