2013-02-13 4 views
3

소나 cpd가 중복 블록을 감지하는 방법에 대한 많은 분석을했습니다. 그러나 블록이나 코드 행을 탐지하는 과정을 정확히 트리거 할 수는 없습니다. 최소 개수 줄의.소나 CPD 감지 블록 복제본

예를 들어 내가 아래에 쓰는 경우 20 번 이상 반복해도 코드 중복을 감지하지 못합니다. 나는 블록을 제공하는 시도에 나중에

 System.out.println("this is good"); 
     System.out.println("this is good"); 

     System.out.println("this is good"); 
     System.out.println("this is good"); 

     System.out.println("this is good"); 

     System.out.println("this is good"); 

     System.out.println("this is good"); 

     System.out.println("this is good"); 

     System.out.println("this is good"); 

     System.out.println("this is good"); 

는 그것이 많은 블록을 가지고에도 불구하고 두 개의 블록으로 고려하고 여기에

 try 
    { 
    connection = null; 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
    try 
    { 
    connection = null; 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
    try{ 
    connection = null; 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
    try{ 
    connection = null; 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 

을 중복.

제가 10으로 일정한 블록 크기를 발견이 http://docs.sonarsource.org/3.1/apidocs/src-html/org/sonar/plugins/cpd/SonarEngine.html

에서 수중 음파 탐지기 3.4.1

하여이 중복 감지에 따라 정확한 과정을 알려하지만이 연관 수 있어요하세요 내 관찰.

+1

이것은 토큰 시퀀스와 일치하는 소위 "토큰 기반"복제 탐지기의 표시입니다. 이들은 오 탐지율이 높습니다. **} catch (예제에서 Exception **은 그러한 탐지기로 작은 복제본으로 간주됩니다. 이러한 탐지기는 몇 가지 추가 제한 사항이있는 꽤 큰 클론을 허용하도록 구성되는 경향이 있습니다. Andras의 대답을 참조하십시오. - 클론 탐지기는 언어 구조 만 일치하므로 ** 예외를 ** 복제본으로 간주하지 않으므로 결과적으로 상당히 작은 입도의 클론을 찾을 수 있습니다. –

답변

0

블록은 균형 잡힌 중괄호 사이의 코드 줄입니다. 상수 블록 크기는 블록에서 일치시킬 10 줄의 코드가 있어야 함을 의미합니다. 중복을 원한다면 이것을 시도하십시오.

public void foo(){ 
//... 10 lines of code 
} 

private void bar(){ 
//.... the same 10 lines of code 
} 
+0

나는 이것을 시도했습니다 – satheesh

+0

두 가지 기능을 제공하고 내부에 난 15 print 문을 두 functions.But에 소나 분석에 어떤 중복을 관찰하지 않았다 – satheesh

+0

두 기능을 본문은 동일했다? –