Programing

개발 중에 코드 중복을 감지하는 방법은 무엇입니까?

lottogame 2020. 10. 20. 07:13
반응형

개발 중에 코드 중복을 감지하는 방법은 무엇입니까?


우리는 상당히 큰 코드베이스, 400K LOC의 C ++를 가지고 있으며 코드 중복은 문제가됩니다. 중복 된 코드 블록을 효과적으로 감지 할 수있는 도구가 있습니까?

이상적으로는 개발자가 문제가있는 위치를 확인하기 위해 가끔 실행하는 것보다 개발 중에 사용할 수있는 것입니다. 또한 이러한 도구를 CruiseControl과 통합하여 체크인 할 때마다 보고서를 제공 할 수 있다면 좋을 것입니다.

얼마 전에 Duploc봤는데 , 멋진 그래프를 보여 주었지만 사용하려면 스몰 토크 환경이 필요하기 때문에 자동으로 실행하기가 다소 어렵습니다.

무료 도구도 좋지만 좋은 상용 도구가 있다면 나도 관심을 가질 것입니다.


Simian 은 C ++ 프로젝트에서 중복 코드를 감지합니다.

업데이트 : Java, C #, C, COBOL, Ruby, JSP, ASP, HTML, XML, Visual Basic, Groovy 소스 코드 및 일반 텍스트 파일에서도 작동합니다.


내가 사용했던 PMD의 복사 및 붙여 넣기 - 감지기를 다음과 같은 래퍼 스크립트를 사용하여 CruiseControl을로 통합 (클래스 패스의 PMD 병을 가지고해야합니다).

수표는 야간에 실행됩니다. 현재 변경 세트의 파일 만 나열하도록 출력을 제한하려면 몇 가지 사용자 정의 프로그래밍이 필요할 수 있습니다 (아이디어 : 변경된 파일 중 하나가 관련된 중복 항목 만 모두 확인하고 나열합니다. 변경 사항이 사용할 수 있으므로 모든 파일을 확인해야합니다. 변경되지 않은 파일의 일부 코드). XML 출력을 사용하고 결과를 구문 분석하여 수행 할 수 있어야합니다. 완료되면 해당 스크립트를 게시하는 것을 잊지 마십시오.)

우선 "텍스트"출력은 괜찮지 만 사용자 친화적 인 방식으로 결과를 표시하고 싶을 것입니다.이 경우 펄 스크립트를 사용하여 CPD의 "xml"출력에서 HTML 파일을 생성합니다. 크루즈의보고 jsp가있는 바람둥이에 게시하여 액세스 할 수 있습니다. 개발자는 거기에서 그들을 볼 수 있으며 더러운 해킹의 결과를 볼 수 있습니다. :)

150 KLoc 코드에서 2 초 미만으로 매우 빠르게 실행됩니다 (빈 줄과 주석은 해당 수에 포함되지 않음).

duplicatecheck.xml :

<project name="duplicatecheck" default="cpd">

<property name="files.dir" value="dir containing your sources"/>
<property name="output.dir" value="dir containing results for publishing"/>

<target name="cpd">
    <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask"/>
    <cpd minimumTokenCount="100" 
         language="cpp" 
         outputFile="${output.dir}/duplicates.txt"
         ignoreLiterals="false"
         ignoreIdentifiers="false"
         format="text">
        <fileset dir="${files.dir}/">
            <include name="**/*.h"/>
            <include name="**/*.cpp"/>
                <!-- exclude third-party stuff -->
            <exclude name="boost/"/>
            <exclude name="cppunit/"/>
        </fileset>
    </cpd>
</target>


duplo 는 Duploc에서 사용되는 알고리즘의 C 구현으로 보입니다. 컴파일 및 설치가 간단하며 옵션이 제한되어 있지만 기본적으로 작동하는 것처럼 보입니다.


상기 봐 PMD 프로젝트 .

나는 그것을 사용한 적이 없지만 항상 원했습니다.


이 데비안 패키지는 다음 과 같은 작업을 수행하는 것 같습니다 .

추신 : [거의] 중복 찾기와 관련된 모든 도구에 대한 부채 태그 가 있어야합니다 . (하지만 무엇이라고 부를까요?)


음, 매일 밤 소스 코드 기반에서 복제 탐지기를 실행할 수 있습니다.

많은 클론 탐지기는 소스 라인을 비교하여 작동하며 정확한 중복 코드 만 찾을 수 있습니다.

위의 CCFinder는 언어 토큰을 비교하여 작동하므로 공백 변경에 민감하지 않습니다. 토큰이 하나만 변경된 경우 (예 : 복제본에서 변수 X를 Y로 변경) 원본 코드의 변형 인 클론을 감지 할 수 있습니다.

이상적으로 원하는 것은 위의 것이지만, 변수가 상대적으로 임의적 일 수있는 클론을 찾는 기능 (예 : 변수를 표현식으로, 명령문을 블록으로 대체하는 등)

CloneDR 복제 탐지기는 Java, C #, C ++, COBOL, VB.net, VB6, Fortran 및 기타 다양한 언어에 대해이 작업을 수행합니다. http://www.semdesigns.com/Products/Clone/index.html 에서 볼 수 있습니다 .

CloneDR 엔진은 여러 언어를 처리 할 수있을뿐만 아니라 ASCII, ISO-8859-1, UTF8, UTF16, EBCDIC, 다양한 Microsoft 인코딩 및 (일본어) Shift-를 포함한 다양한 입력 인코딩 스타일을 처리 할 수 ​​있습니다. JIS.

이 사이트에는 C ++ 용을 포함하여 여러 클론 감지 실행 예제 보고서가 있습니다.

2014 년 2 월 편집 : 이제 모든 C ++ 14를 처리합니다.


CCFinderX 는 여러 프로그래밍 언어 (Java, C, C ++, COBOL, VB, C #)를 지원하는 무료 (사내 사용) 복제 코드 감지기입니다.


"동일한"코드 조각을 찾는 것은 비교적 쉽습니다. 이미 이것을 수행하는 기존 도구가 있습니다 (다른 답변 참조).

때로는 좋은 일이고 때로는 그렇지 않습니다. 너무 세밀한 "수준"에서 수행하면 개발 시간이 단축 될 수 있습니다. 즉, 너무 많은 코드를 리팩토링하려고하면 목표를 잃게됩니다.

더 어려운 것은 동일한 작업을 수행하지만 적절한 문서 없이는 다른 (그러나 유사한) 입력 및 / 또는 알고리즘을 사용하는 여러 함수 / 방법을 찾는 것입니다.

If you have to two or different methods to do the same thing and the programmer try to fix one instance but forget (or does not know they exist) to fix the other ones, you will increase the risk to your software.


Same (http://sourceforge.net/projects/same/) is extremely plain, but it works on text lines instead of tokens, which is useful if you're using a language that isn't supported by one of the fancier clone finders.


ConQAT is a great tool which suports C++ code analysis. Can find duplicates ignoring whitespace. Has extreamly handy gui and console interfaces. Because of it's flexibility it is not an easy to to setup. I've found this blog post very useful for setting up c++ project.


You can use our SourceMeter tool for detecting code duplication. It is a command line tool (very similar to compilers), so you can it easily integrate into continuous integration tools, like CruiseControl your mentioned, or Jenkins.


There is also Simian which supports Java, C#, C++, C, Objective-C, JavaScript...

It's supported by Hudson (like CPD).

Unless you're an open source project, you must pay for Simian.


TeamCity has a powerful code duplication engine for .NET and java, that can effortlessly run as part of your build system.

참고URL : https://stackoverflow.com/questions/191614/how-to-detect-code-duplication-during-development

반응형