KR20050065015A - 프로그램의 복제 여부를 검사하는 방법 및 시스템 - Google Patents

프로그램의 복제 여부를 검사하는 방법 및 시스템 Download PDF

Info

Publication number
KR20050065015A
KR20050065015A KR1020030096642A KR20030096642A KR20050065015A KR 20050065015 A KR20050065015 A KR 20050065015A KR 1020030096642 A KR1020030096642 A KR 1020030096642A KR 20030096642 A KR20030096642 A KR 20030096642A KR 20050065015 A KR20050065015 A KR 20050065015A
Authority
KR
South Korea
Prior art keywords
node
similarity
program
string
expression
Prior art date
Application number
KR1020030096642A
Other languages
English (en)
Inventor
김영철
Original Assignee
(주) 뉴스텍시스템즈
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by (주) 뉴스텍시스템즈 filed Critical (주) 뉴스텍시스템즈
Priority to KR1020030096642A priority Critical patent/KR20050065015A/ko
Publication of KR20050065015A publication Critical patent/KR20050065015A/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3616Software analysis for verifying properties of programs using software metrics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Security & Cryptography (AREA)
  • Quality & Reliability (AREA)
  • Stored Programmes (AREA)

Abstract

추상 구문 트리(Abstract Syntax Tree)를 이용하여 프로그램 소스 코드의 복제 여부를 검사하는 방법 및 시스템이 제공된다. 본 발명에 따른 컴퓨터 프로그램의 복제 여부를 검사하는 방법은 제1 및 제2 프로그램 소스 파일을 입력받는 단계, 제1 및 제2 프로그램 소스 파일로부터 각각 그에 대응하는 제1 및 제2 추상 구문 트리(AST)를 생성하는 단계, 제1 및 제2 추상 구문 트리를 언파싱하여 각각 그에 대응하는 제1 및 제2 노드 스트링을 구하는 단계, 및 제1 및 제2 노드 스트링을 비교하여 제1 및 제2 프로그램 소스 파일의 유사도를 계산하는 단계를 포함한다. 본 발명에 의하면 다양한 유형의 컴퓨터 프로그램 소스 코드의 복제 여부를 신뢰성있게 검사할 수 있으며, 그 유사도를 정량적으로 표현하는 것이 가능하다.

Description

프로그램의 복제 여부를 검사하는 방법 및 시스템 {SYSTEM AND METHOD FOR CHECKING PROGRAM PLAGIARISM}
본 발명은 주로 컴퓨터 프로그램의 소스 코드의 복제 여부를 검사하는 방법 및 시스템에 관한 것으로, 더 상세하게는 추상 구문 트리(AST: Abstract Syntax Tree)를 이용하여 프로그램 소스 코드의 복제 여부를 검사하는 방법 및 시스템에 관한 것이다.
컴퓨터 하드웨어의 발전과 더불어, 컴퓨터 소프트웨어 역시 매우 빠른 속도로 발전을 거듭하고 있다. 이러한 컴퓨터 소프트웨어에 있어서 근래에 큰 문제점으로 대두되고 있는 것이 소프트웨어의 복제 문제이다. 컴퓨터 프로그램 복제란 원본 프로그램을 그대로 복사하거나, 원본 프로그램을 아래 표 1에 나열한 바와 같은 다양한 형태로 변환하는 것을 의미한다.
1. 설명문 변경하기2. 공백(white Space)이나 형식 변환하기3. 식별자(변수 등) 이름 바꾸기4. 코드 블록 재배치하기5. 코드 블록 내에서 문장들 재배치하기6. 수식에서 어퍼랜드/오퍼레이터의 순서 바꾸기7. 데이터 타입 변환하기8. 똑같은 구조를 갖는 제어 구조로 바꾸기9. 필요없는 문장이나 변수 추가하기
프로그램의 복제 여부를 판단하는 방법은 대부분 두 프로그램의 소스 코드가 얼마나 밀접한 연관이 있는지를 검사하는 것으로, 주로 코드의 중복 여부를 검사하는 것과 관련이 있다. 특히 프로그램의 중복된 코드를 찾는 방법에 대해서는 소프트웨어 공학 분야에서 많은 연구가 진행되어 왔으며, 그 결과 프로그램에서 중복된 코드가 보통 7-23%에 달한다는 연구 결과가 나와 있다.
이러한 프로그램의 복제와 관련하여, 다양한 프로그램 복제에 대하여 신뢰성 있는 복제 판별 방법을 구현하고자 많은 방법들이 강구되어 왔는데, 초기의 프로그램 복제 여부 판별 방법으로는 두 프로그램의 텍스트 파일을 단순히 비교하는 방법이 사용되었다. 이 방법에서는, 각각의 프로그램에 대하여 다양한 소프트웨어 특징을 계산하고, n-차원으로 매핑을 하는데. 이러한 방법에는 Halstead 매트릭스를 이용하는 방법과 Halstead 매트릭스를 확장하여 이용하는 방법이 있다. 두 프로그램 사이에 유사도를 검사하기 위한 Halstead 매트릭스를 이용한 방법에서는, 4가지 벡터 즉, H=(μ1, μ2, N1, N2)로 구성된 Halstead 매트릭스를 이용하는데, 여기서 μ1은 유일한 오퍼레이터(operator) 수를, μ2는 유일한 오퍼랜드 (operand) 수를 의미하며, N1는 오퍼레이터의 출현 수를, N2는 오퍼랜드의 출현 수를 의미한다. 이 방법에서는 두 프로그램의 Halstead 매트릭스의 요소인 μ1, μ2, N1, N 2가 같으면, 유사한 프로그램이라고 판정하였다. Halstead 매트릭스를 확장하여 이용한 방법으로는, Halstead 매트릭스 이외에 반복문의 수, 프로시저 (procedure) 문의 수와 같은 프로그램 구조를 혼합하여 이용한 방법 등이 있었다. 이러한 방법들을 이용한 시스템들을 총칭하여 '속성 카운팅 매트릭스 시스템'이라 한다.
최근에 개발된 시스템들은 어휘 분석의 결과물로서 반환되는 토큰 스트링(token string) 등을 이용하여 프로그램 복제 여부를 판단한다. 이러한 시스템들은 초기의 매트릭스를 이용하는 시스템들과는 달리 토큰 스트링을 이용함으로써 프로그램의 설명문, 들여쓰기 등의 요소들에 민감하지 않다는 특징을 가지고 있다. 프로그램 구조를 이용한 대표적인 시스템은 YAP3, MOSS 등이 있다. YAP3은 구조적 매트릭스 방법을 이용한 복제 검사 시스템으로, 크게 2단계로 나뉘어 동작이 수행된다. 첫번째 단계는, 어휘 분석기가 프로그램 소스 코드를 토큰 스트링으로 바꾸는 단계이다. 이 단계에서는 설명문과 스트링 상수를 제거하고, 프로그램 소스 코드를 동일 또는 유사한 동의어로 매핑하며, 함수 호출 순서를 재정렬하는 등의 작업이 수행된다. 두번째 단계는, 첫번째 단계에서 변환된 토큰 스트링을 비교 검사하는 단계로, 이 단계에서는 GST(Greedy-String-Tiling) 알고리즘이 사용된다. 한편, MOSS는 프로그램 복제 검사 시스템 중 가장 많은 언어를 지원한다는 특징이 있으며, 이 시스템에서는 파싱(parsing)되지 않은 파일을 비교 검사한다. MOSS 시스템의 매칭 알고리즘은 토큰이나 라인 매칭을 이용하여 검사된다.
상술한 바와 같은 종래의 프로그램 복제 검사 시스템에서는 매트릭스 또는 토큰 스트링을 이용하여 유사한 코드를 찾아내는 방법을 채택하였으나, 이러한 종래 시스템에 있어서는 들여쓰기, 여백, 설명문 등의 프로그램 스타일을 변형하거나 프로그램 소스 코드의 코드 블록을 재배치한 경우, 신뢰성 있는 복제 여부 검사를 수행하지 못하는 문제점이 있었다.
따라서 본 발명의 목적은 상기 종래의 프로그램 복제 여부 검사 방법에서의 문제점을 해결하고 보다 향상된 프로그램 복제 여부 검사 방법을 제공하는 것이다.
본 발명의 다른 목적은 상기 표 1에서와 같이 다양한 방법으로 변환된 복제 프로그램에 대해서도 효율적으로 적용될 수 있는 프로그램의 유사도 검사 방법을 제공하는 것이다.
본 발명의 다른 목적은 프로그램 소스 코드의 크기와 상관없이 다양한 크기를 갖는 프로그램에 적용될 수 있는 프로그램의 유사도 검사 방법을 제공하는 것이다.
본 발명의 다른 목적은 종래의 프로그램 복제 여부 검사 방법에 비하여 더 정확하게 프로그램의 복제 여부를 정량화하여 표현할 수 있는 프로그램의 유사도 검사 방법을 제공하는 것이다.
본 발명의 다른 목적은 2개의 프로그램에 대해서 뿐만 아니라, 복수 개의 프로그램에 대해서도 상호 유사도를 검사하며, 이 과정에서 종래에 비하여 프로그램 비교 횟수를 대폭 감소시킬 수 있는 프로그램의 유사도 검사 방법을 제공하는 것이다.
본 발명의 일 실시 형태에 따르면, 제1 및 제2 프로그램 소스 파일을 입력받는 단계, 상기 제1 및 제2 프로그램 소스 파일로부터 각각 그에 대응하는 제1 및 제2 추상 구문 트리(AST)를 생성하는 단계, 상기 제1 및 제2 추상 구문 트리를 언파싱하여 각각 그에 대응하는 제1 및 제2 노드 스트링을 구하는 단계, 및 상기 제1 및 제2 노드 스트링을 비교하여 상기 제1 및 제2 프로그램 소스 파일의 유사도를 계산하는 단계를 포함하는 컴퓨터 프로그램의 복제 여부를 검사하는 방법이 제공된다.
본 발명의 다른 실시 형태에 의하면, 상기 제1 노드 스트링의 길이, 상기 제2 노드 스트링의 길이 및 매칭되는 서브 스트링의 길이를 이용하여 유사도를 계산하는 것을 특징으로 하는 컴퓨터 프로그램의 복제 여부를 검사하는 방법이 제공된다.
본 발명의 다른 실시 형태에 의하면, 상기 유사도를 계산하는 단계는, 상기 제1 및 제2 노드 스트링에서 매칭되는 서브 스트링을 찾는 단계, 상기 매칭되는 서브 스트링의 길이가 소정의 임계치보다 큰 지 여부를 판단하는 단계, 및 상기 제1 노드 스트링의 길이, 상기 제2 노드 스트링의 길이 및 상기 매칭되는 서브 스트링의 길이를 이용하여 상기 제1 및 제2 프로그램 소스 파일의 유사도를 계산하는 단계를 포함하는 것을 특징으로 하는 컴퓨터 프로그램의 복제 여부를 검사하는 방법이 제공된다.
본 발명의 다른 실시 형태에 의하면, 상기 제1 및 제2 노드 스트링을 구하는 단계는 "infix", "prefix", "postfix" 방법 중 한가지 방법을 이용하여 구현되는 것을 특징으로 하는 컴퓨터 프로그램의 복제 여부를 검사하는 방법이 제공된다.
본 발명의 다른 실시 형태에 의하면, 2 이상의 프로그램 소스 파일들을 입력받는 단계, 상기 2 이상의 프로그램 소스 파일들로부터 각각 그에 대응하는 추상 구문 트리(AST)들을 생성하는 단계, 상기 추상 구문 트리들을 언파싱하여 각각 그에 대응하는 노드 스트링들을 구하는 단계, 상기 노드 스트링들을 비교하여 상기 2 이상의 프로그램 소스 파일들의 유사도를 계산하는 단계를 포함하고, 상기 유사도를 계산하는 단계는 소정 유사도 이상의 유사도를 갖는 프로그램 소스 파일들의 그룹화를 통하여 이루어지는 것을 특징으로 하는 컴퓨터 프로그램의 복제 여부를 검사하는 방법이 제공된다.
본 발명의 다른 실시 형태에 의하면, 상기 유사도를 계산하는 단계에서는 상기 노드 스트링들의 길이 및 매칭되는 서브 스트링의 길이를 이용하는 것을 특징으로 하는 컴퓨터 프로그램의 복제 여부를 검사하는 방법이 제공된다.
본 발명의 다른 실시 형태에 의하면, 제1 및 제2 프로그램 소스 파일을 입력받는 입력 수단, 상기 제1 및 제2 프로그램 소스 파일로부터 각각 그에 대응하는 제1 및 제2 추상 구문 트리(AST)를 생성하는 구문 분석기, 상기 제1 및 제2 추상 구문 트리를 언파싱하여 각각 그에 대응하는 제1 및 제2 노드 스트링을 구하는 언파서(unparser), 및 상기 제1 및 제2 노드 스트링을 비교하여 상기 제1 및 제2 프로그램 소스 파일의 유사도를 계산하는 복제 검사 엔진를 포함하는 컴퓨터 프로그램의 복제 여부를 검사하는 시스템이 제공된다.
본 발명의 다른 실시 형태에 의하면, 상기 복제 검사 엔진은 상기 제1, 제2 노드 스트링의 길이 및 매칭되는 서브 스트링의 길이를 이용하는 것을 특징으로 하는 컴퓨터 프로그램의 복제 여부를 검사하는 시스템이 제공된다.
이하 첨부된 도면을 참조하여 본 발명의 일 실시예에 따른 프로그램 복제 여부 검사 방법에 대하여 상세히 기술하기로 한다.
도 1은 본 발명의 실시예에 따른 프로그램 복제 검사 모델의 블록도이다. 도 1에 도시된 바와 같이, 본 발명의 일 실시예에 따른 프로그램 복제 검사 모델은, 어휘 분석기(12), 구문 분석기(13), 추상 구문 트리 풀(AST pool, 15), 언파서(unparser, 17), 복제 검사 엔진(18), 유사도 테이블(19)을 포함한다. 프로그램 소스 파일(11)은 어휘 분석기(12)에 입력되며, 어휘 분석기의 출력은 구문 분석기(13)의 입력과 연결된다. 구문 분석기(13)는 AST(14)를 출력하고, 출력된 AST는 AST 풀(15)에 저장되며, AST 풀(15)은 이러한 AST(14)들을 복수개 포함한다. 저장된 복수의 AST들 중 적어도 2개의 AST들(16)은 언파서(17)에 입력되며, AST들(16)을 입력받은 언파서(17)는 노드 스트링을 출력한다. 언파서(17)의 출력은 복제 검사 엔진(18)의 입력과 연결된다. 복제 검사 엔진(18)의 출력은 유사도 테이블(19)과 연결된다.
도 1에 도시된 본 발명의 일 실시예에 따른 프로그램 복제 검사 모델은 크게 2단계로 나뉘어 동작이 수행된다. 제1 단계는 어휘 분석기(12) 및 구문 분석기(13)를 이용하여 입력된 소스 파일(11)의 AST(14)를 생성하는 단계로서, 이 단계에서 수행되는 프로세스들은 일반적인 컴파일러에서 구현되는 프로세스들과 유사하다. 제2 단계는 본 발명의 특징부로서, 언파서(17), 복제 검사 엔진(18), 유사도 테이블(19)을 이용하여, 제1 단계에서 생성된 적어도 2개의 AST들(16)의 프로그램 복제 여부 검사 및 유사도 평가를 수행하는 단계이다.
도 1에 도시된 바와 같은 구성을 통하여, 본 발명의 실시예에 따른 프로그램 복제 여부 검사 방법에서는, 매트릭스나 토큰 스트링을 이용한 종래의 복제 여부 검사 시스템과는 달리, 프로그램 소스 파일의 컴파일 과정에서 생성되는 AST(14, 16)를 이용하여 2개 이상의 프로그램의 유사도를 정량적으로 검사하는 것을 특징으로 한다. 여기서, AST는 최상위 루트 노드를 시작으로, 숫자나 변수를 담을 수 있는 마지막 노드까지의 트리 형태로 구성되며, 결국 프로그램의 소스 코드를 트리 형태로 구성한 것이라 할 수 있다. 또한, 노드들은 노드의 이름과 좌, 우 자노드를 저장할 수 있는 영역을 포함한다.
이하에서는, 도 1에 나타난 어휘 분석기(12), 구문 분석기(13), AST 풀(15), 언파서(unparser, 17), 복제 검사 엔진(18), 유사도 테이블(19)의 각각에 대하여 그 동작 및 작용을 중심으로 항목을 나누어 구체적으로 설명한다. 이하 설명에 있어서, 각 알고리즘을 소프트웨어적으로 구현된 예에 대하여 서술하고 있으나, 본 발명은 이에 제한되지 않으며, 각 알고리즘을 하드웨어적으로 구현된 경우에도 적용이 가능하다. 또한, 본 실시예에 있어서, 복제 검사 대상이 되는 프로그램 소스 파일이 ANSI C 언어로 작성되고, 각 알고리즘이 Java 언어로 구현된 경우를 예시하고 있으나, 본 발명은 이에 제한되지 않으며, 검사 대상 프로그램 소스 파일 및 알고리즘 구현 파일이 각각 다른 종류의 프로그램 언어로 구현된 경우에도 적용될 수 있음은 당업자에게 자명할 것이다.
1. 어휘 분석기(12)
도 1 및 도 2에 도시된 어휘 분석기(12)는, 예를 들어, C 언어로 작성된 프로그램 소스 파일(11)을 입력받아, 입력된 소스 파일을 일련의 토큰들로 나눈 후, 토큰 및 부수적인 정보들을 구문 분석기(13)로 출력하는 동작을 수행한다.
도 2를 참조하여, 이러한 일련의 동작들을 설명하기로 한다. 본 실시예에서의 어휘 분석기(12)는 예를 들어, 공지의 Jlex 유틸리티를 이용하여 구현 가능하지만 이에 제한되지는 않으며, 그 구체적인 구성은 공지된 것이므로 자세한 설명은 생략하고 동작 및 작용에 대해서 간략히 살펴보도록 한다.
도 2에 도시된 바와 같이, 어휘 분석기(12)는 프로그램 소스 파일(11)을 입력받고, 입력받은 소스 파일(11)의 코드들을 일련의 토큰들로 나누는 작업을 수행한다. 예를 들어, "int n; /* length */"라는 소스 코드가 입력된 경우, 어휘 분석기는(12)는 입력된 소스 코드를 도 2에서 나타난 바와 같이 "int", "n", ";", "/* length */"의 토큰들(21)로 나누어 인식한 후 이를 미리 약속한 숫자로 된 내부적인 표현으로 변환한다(도시 생략). 또한, 어휘 분석기(12)는 구문 분석기(13)에 의해 필요에 따라 수시로 호출되어, 인식된 토큰 및 부수적인 정보(예를 들어, 토큰 값, 프로그램 소스 파일의 파일명, 프로그램 소스 파일에서의 토큰의 위치를 나타내는 줄의 수 등)를 구문 분석기(13)에 전달하는 기능을 수행한다.
2. 구문 분석기(13) 및 AST(14)
도 1 및 도 2에 도시된 구문 분석기(13)는 어휘 분석기(12)로부터 일련의 토큰들로 분류되어 출력되는 프로그램 소스 파일을 입력 받은 후, 예를 들어, C 언어의 문법 구조에 적합한가를 검사하고, 그 문법적 구조에 대응하는 AST(14)를 생성한다. 이러한 구문 분석 및 AST 생성에는 공지의 다양한 기술들이 적용될 수 있으며, 본 실시예에서는 JavaCUP을 이용하여 구문 분석기를 구현하였다.
AST의 구조는 언어의 종류나 구현에 따라 다르게 구성될 수 있으며, 프로그램 소스 파일이 커지면 이에 따라서 AST의 크기도 증가하므로 AST의 정의는 최소한의 메모리 자원을 사용하도록 구현되어야 한다. 본 실시예에서는 합성 발생기 (synthesizer generator)에서 사용하는 표기법인 SSL(Synthesizer Specification Language)을 사용하여 AST를 정의하였다. SSL은 다음과 같은 형식의 생성 규칙들의 집합이다.
X0 : op (X1, X2, .... Xk)
| alternative productions
;
수학식 1에서 op는 오퍼레이터 이름이고, Xi는 문법의 비단말 노드(Non-leaf node)이다. 본 실시예에서 적용한 AST 정의와 비단말 노드의 정의는 부록 1 및 2에 첨부된 바와 같으나, 본 발명은 이에 국한되지 않으며 본 발명의 범위를 벗어나지 않는 한 다양한 방법 및 형태로 정의될 수 있음은 당연하다.
도 2에 도시된 바와 같이, 구문 분석기(13)에 의해 생성된 AST(14)는 일련의 토큰들(21)로 분류되어 구문 분석기(13)에 입력된 프로그램 소스 파일(11)의 문법적 구조를 나타내게 된다. AST(14)는 파스 트리(parse tree)와 달리 모든 심볼에 대하여 노드를 만들지 않고 최소한의 노드를 만들게 되므로 이후의 처리 단계에서의 처리량을 대폭 감소시킬 수 있다.
본 실시예에서 사용된 AST 노드의 클래스와 노드 자료구조는 다음 표 2와 같다.
표 2에 나타낸 바와 같이, AST 노드의 자료 구조는 많은 구성요소를 가지고 있다. m_prod는 노드의 종류를 나타내며, 노드 정의는 부록 2에 정의되어 있다. 또한, m_str은 노드 스트링인 경우에 노드 스트링 값을 나타내는데 이용된다. AST 노드의 자식은 크게 4개의 자식, 즉, m_link1, m_link2, m_link3, m_link4로 되어 있는데, 이는 C 언어의 경우 for문과 같이 자식을 최대 4개까지 가질 수 있기 때문이다. 또, 표 2의 m_next, m_prev, m_parent는 각각 다음 노드, 이전 노드, 부모 노드를 가리킨다. m_bCheck는 노드를 검색할 때 검사가 된 것인지 아닌지를 나타내는데 이용되며, m_bMatch는 현재는 사용하지 않았으나 후에 노드 검사시에 일치되는지 여부를 나타내기 위해 예약해 놓았다.
본 실시예에서 생성한 AST 형태를 알아보기 위하여 다음 표 3과 같은 최소공배수를 구하는 C 언어로 작성된 소스 파일이 있다고 가정한다.
표 3의 프로그램 소스 파일의 AST 형태는 본 실시예에 있어서 도 3과 같이 트리 형태로 표현된다. 도 3에 있어서 숫자는 비단말 노드를 가리키며, 각 노드의 정의는 부록 2에 정의되어 있다.
도 3의 AST는 다양한 형태로 나타낼 수 있다. 즉, 트리의 전체 형태를 사용자가 볼 수 있으며, 부분도 세밀하게 볼 수 있다. 예를 들어, 트리의 (+) 아이콘을 클릭하면 해당 하위 트리가 나타나며, (-) 아이콘을 클릭하면 해당 트리를 접을 수도 있다.
3. AST 풀(15)
도 1에 도시된 바와 같이, 구문 분석기(13)에 의해 생성된 AST(14)는 AST 풀(AST pool)(15)이라는 저장소에 저장된다. 즉, AST 풀(15)은 비교할 대상 프로그램들의 AST들을 보관하는 장소로 이용된다. 본 실시예에 있어서, AST 풀은 도 4에 도시된 바와 같이 구성될 수 있다. 도 4에서는 5개의 AST를 포함하고 있는 AST풀을 도시하고 있으며, AST 풀이 저장하는 AST 수는 임의의 것이라도 상관없다.
본 실시예에 따른 프로그램 복제 여부 검사 방법에서는 비교하고자 하는 대상 프로그램들의 AST들을 AST 풀에 저장한 후, 저장된 AST들 중 적어도 2개 이상의 AST에 대하여 언파서(17) 및 복제 검사 엔진(18)을 이용하여 유사도를 검사하게 된다.
4. 언파서(17)
도 1의 언파서(unparser, 17)는 AST 풀(15)에 저장된 2 이상의 AST(16)를 입력받아 AST 형태로 저장된 자료 구조를 노드 스트링(node string) 형태로 변환하여, 변환된 노드 스트링을 복제 검사 엔진(18)으로 출력하는 기능을 수행한다. 즉, 언파서(17)는 적어도 2개 이상의 AST를 비교하기 위하여 트리 구조의 AST를 선형 구조(linear structure)의 노드 스트링으로 변환하는 역할을 수행한다.
도 5a 내지 5c는 언파서(17)가, 예를 들어, 아주 간단한 AST(51) 형태를 AST 노드 스트링(56, 57, 58)으로 변환하는 과정을 설명하는 도면이다.
도 5a는 부모 노드(53)가 자식 노드(54, 55)의 사이에 배치되도록 노드 스트링(56)을 형성하는 "infix" 방식을 도시하는 도면이다. 이 경우, 해당 AST의 노드 스트링은 "65 70 66"이 된다. 도 5b는 부모 노드(53)가 자식 노드(54, 55)의 앞에 배치되도록 노드 스트링(57)을 형성하는 "prefix" 방식을 도시하는 도면이다. 이 경우, 해당 AST의 노드 스트링은 "70 65 66"이 된다. 도 5c는 부모 노드(53)가 자식 노드(54, 55)의 뒤에 배치되도록 노드 스트링(58)을 형성하는 "postfix" 방식을 도시하는 도면이다. 이 경우, 해당 AST의 노드 스트링은 "65 66 70"이 된다. 본 발명은 도 5a 내지 5c에 도시된 "infix", "prefix" 및 "postfix" 방식을 모두 적용할 수 있다.
언파서(17)는 AST의 단말 노드(leaf node)를 생략하고 비단말 노드(non-leaf node)에 대해서만 AST(51)를 해당 노드 스트링(56, 57, 58)으로 변환한다. 도 5a 내지 5c에서는 설명의 편의상 비단말 노드만을 도시하였으며, 단말 노드는 도시하지 않았다. 자료 구조의 특성상 오퍼랜드인 변수나 함수 이름이 단말 노드에 위치하게 되며, 비단말 노드에는 오퍼레이터 등이 위치하기 마련이다. 본 실시예에 따른 언파서(17)는 해당 AST(51)의 단말 노드를 고려하지 않고 AST의 비단말 노드만을 노드 스트링(56, 57, 58)으로 변환함으로써, 소스 코드의 변수나 함수의 이름을 바꾸어도 그에 대응하는 AST의 노드 스트링(56, 57, 58)에는 아무런 변화가 없기 때문에 소스 코드의 변수나 함수의 이름을 바꾸는 경우에도 복제 여부를 신뢰성있게 검사할 수 있다.
5. 복제 검사 엔진(18)
도 1에 도시된 바와 같이, 복제 검사 엔진(18)은 언파서(17)로부터 출력된 적어도 2개 이상의 소스 파일에 대한 노드 스트링을 입력받아 소스 파일 간의 유사도를 출력한다.
이러한 복제 검사 엔진(18)의 동작을 도 6을 참조하여 설명한다. 도 6은 본 발명의 일 실시예에 따라 프로그램의 복제 여부를 검사하고 유사도를 평가하는 복제 검사 엔진(18)의 동작 흐름도이다. 도 6에 도시된 바와 같이, 본 실시예에서의 복제 검사 엔진(18)은 크게 노드 스트링 입력 단계(S61), 초기화 수행 단계(S62), 제1 알고리즘 수행 단계(S63), 제2 알고리즘 수행 단계(S64), 제3 알고리즘 수행 단계(S65), 조건식 판단 단계(S66) 및 제4 알고리즘 수행 단계(S67)를 포함하며, 조건식 만족 여부에 따라 제1 알고리즘 수행 단계(S63), 제2 알고리즘 수행 단계(S64) 및 제3 알고리즘 수행 단계(S65)를 반복하게 된다.
각 단계의 자세한 설명에 앞서, 설명의 편의를 위하여, 프로그램 복제 여부를 검사할 2개의 프로그램 소스 파일을 P1, P2라 명명하며, 언파서(17)에 의해 생성된 P1 및 P2의 노드 스트링을 각각 A, B라고 명명하기로 한다. 또한, "서브 스트링"은 노드 스트링 중 특정 일부분의 스트링으로 정의한다. 노드 스트링의 각각의 스트링은 Xi 형태로 표현될 수 있으며, 여기서 X는 노드 스트링을 의미하고, i는 스트링 X의 인덱스를 의미한다. 또한, 서브 스트링 또는 노드 스트링의 "길이(length)"는 그 서브 스트링 또는 노드 스트링에 포함되는 스트링의 개수를 의미한다.
이하에서는 설명을 위하여, 다음 표 4와 같은 노드 스트링 A, B가 주어진 것으로 가정하고 설명한다. 표 4의 노드 스트링 A는 "23", "34", "25", "54" 등의 16개의 스트링을 포함하며, 스트링 "34"는 A2로 표시할 수 있다. 또, 노드 스트링 A는 "23 34 25 54", "45 49 81" 등의 다수의 서브 스트링을 포함하며, 노드 스트링 A의 길이는 16, 서브 스트링 "45 49 81"의 길이는 3이 된다.
A (P1) : 2334 25 54 44 45 4981 83 84 22 55 44 33 90 68B (P2) :34 25 54 46 4781 83 84 22 55 44 33 90 93 92 95 34 35
다시 도 6을 참조하여 설명하면, 먼저, 단계 S61에서는, 노드 스트링 A, B 및 변수 "minlength"를 입력받는다. 여기서, "minlength"는 "{매칭되는 것으로 인정하는 최단의 서브 스트링의 길이} - 1"로 정의된다. 만약, minlength를 n으로 입력한 경우라면, 2개의 노드 스트링에 있어서 적어도 (n+1)개 이상의 스트링이 서로 동일할 경우에 그 스트링을 포함하는 서브 스트링은 매칭되는 것으로 인정되고, 만약 스트링이 n개만 동일하고 그외의 스트링은 다르면 그 서브 스트링은 매칭되지 않은 것으로 취급한다. 즉, 예를 들어, minlength를 2으로 입력한 경우라면, 예를 들어, "23 34 25 54 44"로 구성된 노드 스트링 A와 "31 34 25 18 17"로 구성된 노드 스트링 B는 매칭되는 서브 스트링이 존재하지 않는 것으로 취급하며, "23 34 25 54 44"로 구성된 노드 스트링 A와 "31 34 25 54 18"로 구성된 노드 스트링 B 사이에는 "34 25 54"라는 매칭된 서브 스트링이 존재하는 것으로 취급한다. 비록 이하 설명에서는 설명의 편의를 위하여 minlength를 2로 설정한 경우에 대하여 설명하고 있지만, 본 실시예에서는 minlength를 5로 설정하는 것이 바람직하다. 왜냐하면 가장 간단한 C 언어 문장의 노드 수가 5개이기 때문이다. 이처럼 minlength값은 검사하는 대상 프로그램에 따라 값을 변경하여 입력할 수 있다.
다음으로, 초기화 수행 단계(S62)는 다음 단계에서 수행되는 알고리즘 및 판단 알고리즘을 초기화하는 단계로서, 그 방법은 일반적인 프로그램에서의 초기화 과정과 동일하므로 더이상의 설명은 생략한다.
초기화 수행 이후에, 제1 알고리즘 수행 단계(S63)에서는, 입력된 2개의 노드 스트링 A 및 B를 비교하여, 상호 매칭되는 서브 스트링을 구한다. 이 과정에서는, 매칭되는 스트링을 포함하는 서브 스트링 중에서 가장 긴 서브 스트링(MMS: Maximum Match String)을 찾는다. 예를 들어, 노드 스트링 A가 "23 34 25 54 44 45"로 구성되고, 노드 스트링 B가 "34 25 54 44 47 81"로 구성된 경우, 단계 S63에서 구하는 서브 스트링은 "34 25 54"가 아니라 "34 25 54 44"이 된다. 표 4와 같이 노드 스트링 A와 B가 주어진 경우라면, "34 25 54"를 먼저 찾게 된다.
이어서, 제2 알고리즘 수행 단계(S64)에서는 단계 S63에서 매칭된 것으로 검색된 스트링에 마크를 하는 동작을 수행한다. 표 4와 같이 노드 스트링 A와 B가 주어진 경우라면, 단계 S64에서는 스트링 "34", "25", "54"에 마크를 한다. 단계 S64에서의 마크 동작을 통해, 매칭된 것으로 마크된 스트링에 대해서 더 이상 매칭 검사를 하지 않음으로써, 중복 검사를 방지한다.
다음으로 제3 알고리즘 수행 단계(S65)에서는 제1 알고리즘(S63)에서 찾은 매칭된 서브 스트링을 소정의 변수에 저장한다. 조건식 판단 단계(S66)에서 조건식이 만족되어 제1 알고리즘(S62) 및 제2 알고리즘(S63)이 다시 수행되는 경우, 다시 수행된 제1 알고리즘(S62)에서 새로이 찾은 매칭 서브 스트링은 이전에 찾은 매칭 서브 스트링 다음에 순서대로 저장된다. 표 4와 같이 노드 스트링 A와 B가 주어진 경우라면, 예를 들어, "Set(totalmatchstring)"라는 서브 스트링 집합 변수에 {"34 25 54"}를 저장하게 된다.
이어서, 조건식 판단 단계(S66)에서는 일정 조건(즉, 변수 "maxmatch" 값이 변수 "minlenghth" 값보다 큰 경우)을 만족하는지 여부를 판단하여, 조건이 만족되면 제1 알고리즘(S63), 제2 알고리즘(S64) 및 제3 알고리즘(S65)을 다시 수행하게 되고, 조건이 만족되지 않으면 제4 알고리즘(S67)을 수행하게 된다. 조건식 판단 단계(S66)에서의 변수 "maxmatch"는 노드 스트링 A, B에서 서로 매칭되는 서브 스트링의 길이를 의미한다.
만약 "maxmatch"값이 단계 S61에서 입력받은 "minlength"값보다 큰 경우라면, 제1 알고리즘(S63), 제2 알고리즘(S64) 및 제3 알고리즘(S65)을 반복적으로 수행하여, 노드 스트링 A, B의 마크되지 않은 스트링(즉, 이전 단계에서 매칭된 것으로 찾은 스트링이 아닌 스트링)을 포함하는 서브 스트링 중에서 가장 긴 매칭 서브 스트링을 찾고(S63), 찾은 스트링에 마크를 하며(S64), 찾은 매칭 서브 스트링을 소정 변수에 저장한다(S65). 예를 들어, 표 4와 같이 노드 스트링 A와 B가 주어진 경우, "maxmatch" 값은 3이고 이 값은 "minlength" 값인 2보다 크기 때문에 다시 제1 알고리즘을 수행하여(S63) 2번째로 매칭되는 서브 스트링 "81 83 84 22 55 44 33 90"을 찾고, 제2 알고리즘을 수행하여(S64) 스트링 "81", "83", "84", "22", "55", "44", "33", "90" 각각에 마크를 하며, 제3 알고리즘을 수행하여(S65) "Set(totalmatchstring)"라는 서브 스트링 집합 변수에 "81 83 84 22 55 44 33 90"를 저장함으로써, 결국 "Set(totalmatchstring)"는 {"34 25 54", "81 83 84 22 55 44 33 90"}의 형태를 갖게 된다.
만약 "maxmatch"값이 단계 S61에서 입력받은 "minlength" 값보다 작은 경우라면, 제4 알고리즘 수행 단계(S67)로 진행하여, 두 노드 스트링 A, B의 유사도(Sim (A, B)로 표시함)를 계산하고 반환한다. 유사도 계산에서는 여러 가지 방법이 사용될 수 있으나, 본 실시예에서는 다음의 수학식 2을 사용하였다.
위 수학식 2에서 "Length(A)"는 노드 스트링 A의 길이를 구하는 함수를 의미하고, 변수 "matchlength"는 매칭되는 서브 스트링들의 길이의 합을 의미한다. 즉, "matchlength"는 서브 스트링 집합 변수 "Set(totalmatchstring)"의 집합 원소인 서브 스트링들의 길이의 합이 된다. 예를 들어, 표 4와 같이 노드 스트링 A와 B가 주어진 경우, "Length(A)" 값은 16이고, "Length(B)" 값은 18이며, "Set(totalmatchstring)"의 집합 원소인 "34 25 54"과 "81 83 84 22 55 44 33 90"의 길이 3과 8의 합인 11이 matchlength 값으로 정해진다. 따라서, 표 4의 노드 스트링 A, B에 대하여,
라는 유사도 값을 얻게 된다.
수학식 2에 나타난 유사도는 0과 1 사이의 값을 갖는다. 유사도가 0인 경우는 검사 대상인 두 노드 스트링 중 하나가 공 노드 스트링(empty node string)이거나, 매칭되는 서브 스트링의 길이가 minlength 값보다 작은 경우이다. 실제로 두 프로그램을 비교하면 0 값이 나올 확률은 희박하다. 왜냐하면, 비교 대상 프로그램에는 특정 키워드나 기본 함수가 반드시 공통적으로 존재하기 때문이다. 유사도 값이 1인 경우는 검사 대상인 두 노드 스트링이 완전히 일치하는 경우이다. 유사도 값이 0보다 크고 1보다 작은 경우는 검사 대상 프로그램 중에서 일치하는 부분이 존재함을 의미한다. 이와 같이 본 실시예에 따를 경우, 두 프로그램 소스 파일의 유사도를 정량적으로 나타낼 수 있다. 또한, 본 실시예에서는 유사도가 0.9 이상인 경우 강한 유사, 유사도가 0.7~0.9인 경우 중간 유사, 유사도가 0.7 이하일 경우 약한 유사로 설정할 수도 있다.
수학식 2의 유사도 평가 수식은 본 실시예에 매우 적합하다. 그 이유는, 본 실시예에서는 두개의 노드 스트링에서 일치되는 서브 스트링을 찾아 유사도를 평가하기 때문이다. 즉, 본 실시예에서는, 두 노드 스트링을 구해서 공통된 서브 스트링을 찾는 알고리즘을 사용하기 때문에, 그 과정에서 계산되는 값들을 그대로 이용할 수가 있어 매우 효율적이다.
이하에서는, 도 6에 도시된 본 발명의 일 실시예에 따라 프로그램의 복제 여부를 검사하고 유사도를 평가하는 복제 검사 엔진(18)의 동작 흐름도를 구체적으로 구현한 알고리즘의 일 실시예를 설명하도록 한다. 본 발명은 이하 설명되는 구체적인 실시예에 한정되는 것이 아니며, 본 발명의 범위를 벗어나지 않는한 다양한 수정이나 변경이 가능하다.
아래 표 5는 본 발명에 따라 복제 검사 엔진(18)을 소프트웨어적으로 구현한 알고리즘의 일 실시예를 나타낸다.
표 5에 나타난 변수 및 함수들에 대하여 살펴보면 다음과 같다.
스트링 변수 "matchstring", "totalmatchstring"은 매칭되는 스트링을 포함하는 서브 스트링 중에서 가장 긴 서브 스트링(MMS: Maximum Match String)을 나타내는 변수이다. 변수 "maxmatch"는 매칭되는 서브 스트링의 길이를 의미하며, 조건식 판단 단계(S66)에서 제1, 제2, 제3 알고리즘의 반복 여부의 판단시에 사용된다. 변수 "matchlength"는 매칭된 서브 스트링들의 길이의 합으로서, 수학식 2에 나타난 변수를 표시한다. 서브 스트링 집합 변수 "Set(totalmatchstring)"는 매칭되는 서브 스트링들의 집합을 나타낸다. 함수 "MatchString(A, B)"는 제1 알고리즘(S63)및 제2 알고리즘(S64)을 수행하여 매칭되는 최장 서브 스트링을 찾아내고, 그 서브 스트링에 포함되는 스트링에 마크를 하는 알고리즘을 나타낸다. 함수 "Length(A)"는 노드 스트링 A의 길이를 출력하는 함수를 의미한다.
표 5에 나타난 알고리즘의 동작을 살펴본다. 표 5의 알고리즘은 각종 변수 및 함수의 초기화 수행 단계, 1개의 "do while"문과, 1개의 "for"문 및 "return"문으로 구성된다. 초기화 수행 단계는 도 6의 단계 S62에 대응하며, "do while"은 도 6의 제1 알고리즘 수행 단계(S63), 제2 알고리즘 수행 단계(S64), 제3 알고리즘 수행 단계(S65) 및 조건식 판단 단계(S66)에 대응한다. 표 5의 "For"문 및 "return"문은 도 6의 제4 알고리즘 수행 단계(S67)에 대응한다.
먼저, "do while"문에서는 제1 알고리즘(S63) 및 제2 알고리즘(S64)에 대응하는 "MatchString(A, B)" 함수를 수행함으로써, 입력된 2개의 노드 스트링 A, B를 비교하여 상호 매칭되는 최장 서브 스트링을 구하고, 이렇게 구해진 최장 서브 스트링에 마크를 하는 동작을 수행한다. 이어서, 도 6의 제3 알고리즘(S65)에 해당하는 "Set(totalmatchstring)=Set(totalmatchstring)+matchstring;" 명령을 수행하여, "MatchString(A, B)" 함수를 통해 구한 최장 서브 스트링을 서브 스트링의 집합 변수인 "Set(totalmatchstring)"에, 이전에 구한 서브 스트링 다음에 저장한다. 제1, 제2, 제3 알고리즘은 "do while"문의 조건식(즉, maxmatch > minlength)을 만족하는 동안 반복된다. 예를 들어, 표 4와 같이 노드 스트링 A, B가 주어진 경우, "do while"문은 2번 반복하게 되고, 변수 "matchstring"은 첫번째 반복문에서는 "34 25 54"로, 두번째 반복문에서는 "81 83 84 22 55 44 33 90"이 된다. 2번 반복된 "do while"문에 의해 서브 스트링의 집합 변수 "Set(totalmatchstring)"은 {"34 25 54", "81 83 84 22 55 44 33 90"}이 된다.
이어서 표 5의 "for"문에서는 매칭된 서브 스트링에 대하여 "matchlength"값을 구하게 된다. 예를 들어, 표 4와 같이 노드 스트링 A, B가 주어진 경우, "matchlength"값은 "Set(totalmatchstring)"의 집합 원소인 "34 25 54"과 "81 83 84 22 55 44 33 90"의 길이 3과 8의 합인 11로 정해진다.
이어서 표 3의 "return"문에서는 수학식 1을 이용하여 유사도 값을 계산하여 반환한다. 예를 들어, 표 4와 같이 노드 스트링 A, B가 주어진 경우, 유사도는
으로 계산된다.
아래 표 6에서는 표 5의 "do while"문 내에서 수행되는 "MatchString(A, B)" 함수의 일 실시예를 나타내었다. 상기한 바와 같이, 표 6의 "MatchString(A, B)" 함수는 도 6의 제1 알고리즘 수행 단계(S63) 및 제2 알고리즘 수행 단계(S64)에 대응하는 동작을 수행한다.
표 6에 나타난 각 변수에 대하여 간단히 살펴본다.
변수 "i", "j"는 각각, 노드 스트링 A 및 B의 스트링의 인덱스를 나타낸다.
변수 "matchsize"는 노드 스트링 A, B 중 매칭되는 서브 스트링의 길이를 의미한다. 예를 들어, 표 4와 같이 노드 스트링 A, B가 주어진 경우 "matchsize" 값은 3(서브 스트링 "34 25 54"의 길이)과 8(서브 스트링 "81 83 84 22 55 44 33 90"의 길이)이 된다.
함수 "unmark(Ai)"는 노드 스트링 A에서 i번째 스트링이 마크되었는지를 검사하는 함수로 정의한다. 제1 알고리즘에서 매칭되는 서브 스트링을 찾은 이후에 제2 알고리즘 수행 단계(S64)에서는 이후의 중복 검사를 피하기 위하여, 검색된 스트링에 마크를 하게 되는데, unmark(Ai)는 노드 스트링 A에서 i번째 스트링이 마크된 것인지 여부를 검사하는 함수로 이용된다.
변수 "match(Ai, Bj, matchsize)는 두 노드 스트링 A, B에 대하여 각각 인덱스 i, j부터 시작하여 matchsize만큼 일치되는 스트링으로 정의하며, 변수 "match"를 호출하는 경우 반환되는 값은 두 노드 스트링에서 매칭되는 서브 스트링이 된다.
표 6에 나타난 알고리즘 실시예의 수행 과정에 대해 살펴본다. 표 6의 알고리즘은 2개의 "for" 반복문 안에, 일정 조건 하에서 수행되는 "while"문을 포함하고 있으며, "while"문 안에서는 "if"문에 의해 일정 조건 하에서, 매칭되는 서브 스트링을 변수 "matchstring"에 할당하도록 구성되어 있다. 이 과정 이후에 매칭되는 스트링을 마크하기 위해 제2 알고리즘을 호출하고, 매칭되는 스트링을 포함하는 서브 스트링 중에서 가장 긴 서브 스트링을 반환한다.
보다 구체적으로 살펴보면, 노드 스트링 A 및 B의 서브 스트링 중에서 마크되지 않은 스트링(즉, 이전 단계에서 매칭되는 스트링으로 마크되지 않은 스트링)에 대하여 2개의 "for" 반복문을 수행한다. "for" 반복문이 수행되는 동안, 매칭되는 서브 스트링의 길이 "matchsize"를 초기화한 후, 노드 스트링 A 및 B의 마크되지 않은 서브 스트링에 대하여 스트링이 서로 매칭되는 조건 하에서 "while"문을 수행한다. 만약 "while"문의 조건이 만족되면 (즉, 노드 스트링 A, B의 각 해당 스트링에 마크가 되어 있지 않고, 노드 스트링 A, B의 각 해당 스트링이 서로 매칭된 경우), "matchsize" 값을 증가시킨 후, "if"문에서 조건식을 만족하는지 검색하고, 만약 "if" 조건문을 만족하지 않는 경우에는 아무런 동작도 수행하지 않으며, 만약 "if" 조건문을 만족하지 않는 경우(즉, 현재 "while"문 수행 단계에서 찾은 서브 스트링의 길이가 이전 "while"문에서 찾은 서브 스트링의 길이보다 클 경우)에는 가장 긴 서브 스트링을 변수 "matchstring"에 할당한다. 다음으로, 매칭되는 스트링을 마크하기 위하여 도 6의 제2 알고리즘(S64)에 해당하는 함수 "MarkString(A, B, i, j, matchsize)"를 호출하며, 변수 "matchstring"에 할당된 가장 긴 서브 스트링을 반환한다.
아래의 표 7은 표 6의 함수 "MatchString"에서 호출되는 함수 "MarkString"의 일 실시예로서의 구체적인 알고리즘을 나타낸다.
표 7의 "MarkString" 함수는 도 6의 제2 알고리즘(S64)에 대응되며, 제1 알고리즘 수행 단계(S63)에서 매칭된 것으로 검색된 스트링에 마크를 행하는 동작을 수행한다. 표 7에서 함수 "Marking(Ai)"는 노드 스트링 A의 i번째 스트링을 마크하는 함수로 정의된다. 제1 알고리즘 수행 단계(S63)에서 매칭된 것으로 검색된 스트링은 "MarkString" 함수에 의하여 마크가 되기 때문에, 이후 제1 알고리즘이 다시 수행될 지라도 검색 대상에서 제외된다. 이러한 마크 동작을 통하여 후속 과정에서 중복 검사를 피할 수 있다.
6. 유사도 테이블(19)
이상 설명에서는 2개의 프로그램 소스 파일을 비교하는 실시예에 대하여 주로 기술하였다. 그러나, 본 발명은 복수 개의 프로그램 소스 파일을 비교하는 데에도 사용될 수 있다. 이와 같이 2개 이상의 프로그램 소스 파일을 비교하는 데에는 유사도 테이블(19)을 사용할 수 있다. 아래의 표 8은 프로그램 소스 파일 P1, P2, P3, P4, P5이 있다고 가정했을 때 그에 대한 유사도 테이블을 예시한 것이다.
프로그램 P2 P3 P4 P5
P1 0.80 0.93 0.62 0.65
P2 0.92 0.67 0.5
P3 0.43 0.8
P4 0.85
표 8에서 표 안의 숫자는 두 프로그램 소스 파일 사이의 유사도를 나타낸다. 따라서, 예를 들어, 프로그램 소스 파일 P1과 P2 사이의 유사도는 0.80이고, P1과 P3 사이의 유사도는 0.93이 된다.
만약 n개의 프로그램 소스 파일(11)이 존재할 경우 모든 프로그램을 비교하는데 필요한 유사도 검사 횟수는 n(n-1)/2이다. 따라서, 비교하는 프로그램 소스 파일의 수가 많아질수록 복제 여부 검사를 하는데 걸리는 시간 및 비용은 그 제곱에 비례하여 커지게 된다. 따라서, 본 발명에 따른 실시예에서는 프로그램의 유사성이 높은 집단을 그룹으로 만들어 그룹끼리 비교를 행함으로써, 복제 여부 검사를 위해 프로그램을 비교하는데 걸리는 시간 및 비용을 대폭 감소시킬 수 있다.
본 실시예에서는 전역 유사도(Global Similarity)(즉, 전체 유사도를 나타내는 척도) g를 기준으로 프로그램 소스 파일들을 전역 그룹으로 나눈다. 전역 그룹 G는 다음 수학식 3와 같이 정의된다.
sim(A, B) ≥g, ∀A ∈ G, ∀B ∈ G
위 수학식 3와 같이 전역 그룹 G는 상호 유사도가 g값 이상인 프로그램의 집합을 말한다. 예를 들어, 전역 유사도 g가 0.8일 경우, 표 8에서 유사도 값이 0.8 이상인 프로그램들을 그룹지으면, {P1, P2, P3}, {P4, P5}가 된다. 표 8에 주어진 5개의 프로그램들의 그룹 짓기에 대한 개략도를 도 7에 도시하였다.
그러나, 이렇게 전역 유사도만을 이용하여 그룹을 지으면 문제가 생길 수도 있다. 예를 들어, 표 8에서 P5는 P1, P2에 대해서는 전역 유사도 값인 0.8보다 작은 유사도 값을 갖지만, P3에 대해서는 전역 유사도와 같은 0.8의 유사도를 갖는다. 이 경우 P5는 P1 및 P2와는 다르지만, P3와는 유사하다는 것을 의미한다. 따라서, 전역 그룹을 짓는 경우에는 P5와 같이 예외적인 프로그램 소스 파일이 존재할 수 있으므로, 이러한 경우를 대비하여 지역 그룹을 통해 보완할 수 있다.
지역 그룹 L은 다음 수학식 4와 같은 유사도를 갖는 프로그램 소스 파일들의 집합을 의미한다.
sim(A, B) ≥g, ∀A ∈ G, ∃B ∈ G
지역 그룹 L은 수학식 4와 같이 전역 그룹 G에는 공통적으로 포함되어 있지 않으나, 전역 유사도 이상의 유사도 값을 갖는 프로그램 소스 파일의 집단을 의미한다. 예를 들어, 표 8과 같이 5개의 프로그램 소스 파일이 주어진 경우, P3, P5가 지역 그룹을 형성하게 된다. 즉, 도 7에 도시된 바와 같이, P3은 전역 그룹 A에 속하고 P5는 전역 그룹 B에 속하지만, 두 프로그램 사이의 유사도는 전역 유사도 값을 만족하기 때문에, 지역 그룹 L로 정의할 수 있다.
표 9는 전역 유사도만을 기준으로 하여 다수의 프로그램의 그룹을 짓고 유사도 여부를 판정하는 알고리즘의 일 실시예를 나타낸다.
표 9에서 변수 "P"는 비교 대상 프로그램을 나타내는 변수이며, "g"는 전역 유사도 값이다. "addgroup"은 추가 여부를 판단하기 위한 플래그(flag)로 사용되는 변수이고, "G(i)"는 i번째 그룹을 나타낸다.
표 9의 알고리즘은 먼저, 첫번째 그룹 G(1)에 제1 프로그램을 추가하고, 초기화 수행 이후에 "while"문을 수행한다. "while"문에서는 비교 대상 프로그램 소스 파일이 끝날 때까지 반복적으로 "for"문 및 "if"문을 수행한다. 먼저 "for"문에서는 모든 그룹에 대하여, 만약 입력된 비교 대상 프로그램 소스 파일과 기존 그룹에 존재하는 프로그램 소스 파일의 유사도가 전역 유사도 g보다 큰 경우, 입력된 소스 파일을 그 그룹에 추가하며, "if"문에서는 만약 그룹에 추가되지 못한 경우라면, 새로운 그룹을 생성하게 된다.
표 9의 알고리즘의 동작에 의해, 표 8에 나타난 5개의 프로그램 소스 파일들의 그룹화를 수행하는 과정을 도 8에 도시하였다.
도 8의 초기 단계에서는 P1을 제1 그룹에 추가한다. 제1 단계에서는 P1과 P2의 유사도가 전역 유사도 0.8 이상인지 여부를 검사한다. 표 8에 나타난 P1과 P2의 유사도는 0.80이므로 P2를 제1 그룹에 추가한다. 제2 단계에서는 P3과 제1 그룹의 기존 프로그램 P1과의 유사도가 전역 유사도 0.8 이상인지 여부를 검사한다. 표 8에 나타난 바와 같이 sim(P1, P3)는 각각 0.93이므로 P3를 제1 그룹에 추가한다. 제3 단계에서는 P4와 제1 그룹의 기존 프로그램 P1과의 유사도가 전역 유사도 0.8 이상인지 여부를 검사한다. P4와 P1의 유사도는 0.62이므로, 제4 단계에서 P4를 제2 그룹에 추가한다. 제 5단계에서는 P5와 제1 그룹의 기존 프로그램 P1과의 유사도가 전역 유사도 0.8 이상인지 여부를 검사한다. 표 8에서 sim(P1, P5)값은 0.65이므로 P5는 제1 그룹에 추가하지 않는다. 제6 단계에서는 P5와 제2 그룹의 기존 프로그램 P4와의 유사도가 전역 유사도 0.8 이상인지 여부를 검사한다. 표 8에서 sim(P4, P5)는 0.85이므로 P5를 제2 그룹에 추가한다. 도 8에 도시된 바와 같은 6단계를 거쳐, {P1, P2, P3}, {P4, P5}와 같이 그룹화가 이루어진다.
상술한 바와 같은 그룹화를 통하여 다수의 프로그램 소스 파일의 복제 여부를 검사하게 되면, 비교 횟수를 크게 줄일 수 있다. 만약 그룹화를 하지 않고 프로그램 비교를 행한다면 (5*4)/2 = 10번의 비교를 행해야 하지만, 상술한 바와 같은 그룹화를 행하면 도 8에서와 마찬가지로 6번의 비교(유사도 검사)만으로도 모든 프로그램의 유사도를 측정할 수 있다. 이처럼 그룹화 알고리즘을 사용하게 되면, n개의 프로그램 소스 파일에 대하여 수행되는 비교의 횟수는 (n-1)번 내지 n(n-1)/2가 되므로, n이 커질수록 비교 횟수는 크게 줄어들게 된다.
이상의 설명에서는 소프트웨어적으로 구현된 실시예에 대하여 설명하였으나, 본 발명은 하드웨어적으로도 구현이 가능하며, 소프트웨어를 포함하는 컴퓨터로 판독 가능한 기록매체에 대해서도 적용이 가능하다. 또한, 본 발명은, 본 발명이 속하는 기술분야에서 통상의 지식을 가진 자에게 본 발명의 기술적 사상을 벗어나지 않는 범위 내에서 여러 가지 치환, 변형 및 변경이 가능하며 전술한 실시예 및 첨부된 도면에 한정되지 않는다.
본 발명에 따른 프로그램 복제 검사 방법에 따를 경우, 표 1에 나타난 모든 프로그램 프로그램 복제 유형에 대하여 검사를 효율적으로 행할 수 있다. 즉, 설명문을 변경한 경우, 공백이나 형식을 변환한 경우, 코드 블록을 재배치하거나 코드 블록 내에서 문장들을 재배치한 경우, 데이터 타입을 변환한 경우, 똑같은 구조를 갖는 제어 구조로 바꾼 경우 및 필요없는 문장이나 변수를 추가한 경우일지라도 신뢰성 있는 유사도를 정량적으로 제공할 수 있다.
또한, 본 발명에 따른 프로그램 복제 검사 방법은 프로그램 소스 코드의 크기와 상관없이 다양한 크기를 갖는 프로그램에 적용될 수 있으며, 그룹화를 통하여 복수개의 프로그램의 복제 여부를 빠르게 검사하는 데에도 사용될 수 있다.
본 발명은 상술한 효과 이외에도 본 발명이 속하는 기술 분야에서 통상의 지식을 가진 자가 인식할 수 있는 더 많은 효과를 갖는다.
부록 1. C 언어의 AST 정의
(아래에서 *aId, *aId_list, *aType 등은 심볼테이블의 각 identifier에 대한 포인터를 지칭한다.)
program
NProgram (translation_unit)
translation_unit
NExternalDeclList (translation_unit,translation_unit)
NFunction (*aId, *aId_list, statement)
NDeclaration (*aId_list)
initializer
NInitializerList (initializer,initializer)
NInitializer (expression)
statement_list
NStmtListNil ()
NStmtList (statement_list,statement)
statement
NLabeledStmt (ID,statement)
NCaseLabeledStmt (expression,statement)
NDefaultLabeledStmt (statement)
NEmptyStmt ()
NExpStmt (expression)
NCompoundStmt (*aId_list,statement_list)
NIfThenStmt (expression,statement)
NIfThenElseStmt (expression,statement,statement)
NSwitchStmt (expression,statement)
NWhileStmt (expression,statement)
NDoWhileStmt (statement,expression)
NForStmt (for_expression,statement)
NGotoStmt (ID)
NContinueStmt ()
NBreakStmt ()
NReturnStmt (expr_opt)
for_expression
NForExp (expr_opt,expr_opt,expr_opt)
expr_opt
NExpOptNil ()
NExpOpt (expression)
expression
NCommaExp (expression, expression)
NAssignExp (expression, expression)
NStarAssignExp (expression, expression)
NPlusAssignExp (expression, expression)
NSlashAssignExp (expression, expression)
NMinusAssignExp (expression, expression)
NPrecentAssignExp (expression, expression)
NShiftLeftAssignExp (expression, expression)
NShiftRightAssignExp (expression, expression)
NBitwiseAndAssignExp (expression, expression)
NBitwiseXorAssignExp (expression, expression)
NBitwiseOrAssignExp (expression, expression)
NConditionalExp (expression,expression,expression)
NOrExp (expression,expression)
NAndExp (expression,expression)
NBitwiseOrExp (expression,expression)
NBitwiseXorExp (expression,expression)
NBitwiseAndExp (expression,expression)
NEqualTestExp (expression,expression)
NNotEqualTestExp (expression,expression)
NLessThanTestExp (expression,expression)
NGreaterThanTestExp (expression,expression)
NLessThanOrEqualTestExp (expression,expression)
NGreaterThanOrEqualTestExp (expression,expression)
NShiftLeftExp (expression,expression)
NShiftRightExp (expression,expression)
NAddExp (expression,expression)
NSubtractExp (expression,expression)
NMultiplyExp (expression,expression)
NDivideExp (expression,expression)
NModExp (expression,expression)
NTypeConversionExp (*aType,expression)
NPreIncrementExp (expression)
NPreDecrementExp (expression)
NAddressExp (expression)
NIndirectExp (expression)
NPlusExp (expression)
NMinusExp (expression)
NComplementExp (expression)
NNotExp (expression)
NSizeofExp (expression)
NSizeofTypeExp (*aType)
NIdentExp (*aId)
NIntegerConstantExp (int_value)
NCharacterConstantExp (string)
NFloatingConstantExp (string)
NEnumerationConstantExp (int_value)
NStringConstantExp (string)
NArrayExp (expression,expression)
NFunctionCallExp (expression,argument_list_opt)
NStructFieldExp (expression,ID)
NPointerFieldExp (expression,ID)
NPostIncrementExp (expression)
NPostDecrementExp (expression)
argument_list_opt
NArgumentExpListOptNil ()
NArgumentExpListOpt (argument_exp_list)
argument_exp_list
NArgumentExpList (argument_exp_list,argument_exp_list)
NArgumentExp (expression)
부록 2. AST 비단말 노드 정의
/* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
package ppc.parser.ast;
public final class AST
//===============================
// Non Terminal Prod ID List
//======================+========
//-------------------------------
// - 1. Main Syntax
//-------------------------------
public static final int NProgram = 101;
public static final int NTransUnit = 102;
public static final int NTransUnitList = 103;
public static final int NExterDeclFuncDef = 104;
public static final int NExterDeclDecl = 105;
public static final int NFuncDefCompStmt = 106;
...(중략)
public static final int NTypeSpecEnumSpec = 135;
public static final int NTypeSpecTypedefName = 136;
public static final int NTypeQualConst = 138;
public static final int NTypeQualVolatile = 139;
//---------------------------------
// - 2. Struct or Union
//---------------------------------
public static final int NStructOrUnionSpecStructDeclList = 201;
public static final int NStructOrUnionSpecIdentStructDeclList = 202;
public static final int NStructOrUnionSpecIdent = 203;
public static final int NStructOrUnionStruct = 204;
public static final int NStructOrUnionUnion = 205;
public static final int NStructDeclList = 206;
...(중략)
public static final int NEnumListList = 226;
public static final int NEnumIdent = 227;
public static final int NEnumConstExpr = 228;
//---------------------------------
// - 3. Declarator
//---------------------------------
public static final int NDeclDirectDecl = 301;
public static final int NDeclPointerDirectDecl = 302;
public static final int NDirectDeclIdent = 303;
public static final int NDirectDeclDecl = 304;
...(중략)
public static final int NDirectAbstDeclConstExpr = 337;
public static final int NDirectAbstDeclDirectAbstDeclB = 338;
public static final int NDirectAbstDeclDirectAbstDeclConstExpr = 339;
public static final int NDirectAbstDeclP = 340;
public static final int NDirectAbstDeclParamTypeList = 341;
public static final int NDirectAbstDeclDirectAbstDeclP = 342;
public static final int NDirectAbstDeclDirectAbstDeclParamTypeList = 343;
//-----------------------------
// - 4. Statements
//-----------------------------
public static final int NLabeledStmtIdent = 401;
public static final int NStmtLabeledStmt = 402;
public static final int NStmtExprStmt = 403;
public static final int NStmtCompStmt = 404;
public static final int NStmtSelStmt = 405;
...(중략)
public static final int NJumpStmtBreak = 434;
public static final int NJumpStmtReturn = 435;
public static final int JumpStmtReturnExpr = 436;
//---------------------------------
// - 5. Expressions
//---------------------------------
public static final int NExpr = 501;
public static final int NExprList = 502;
public static final int NAssignExprCondExpr = 503;
public static final int NAssignExprUnaryExpr = 504;
public static final int NAssignOperAssign = 505;
public static final int NAssignOperTimesEql = 506;
public static final int NAssignOperSlashEql = 507;
public static final int NAssignOperPercentEql = 508;
...(중략)
public static final int NConstEnum = 578;
//--------------------------------
// - 9. String
//--------------------------------
public static final int NSTR = 999;
도 1은 본 발명의 일 실시예에 따른 프로그램 복제 검사 모델의 블록도.
도 2는 본 발명의 일 실시예에 따른 어휘 분석기 및 구문 분석기의 동작을 설명하기 위한 개략적인 도면.
도 3은 본 발명의 일 실시예에 따른 프로그램 소스 파일에 대한 AST 형태를 도시한 도면.
도 4는 본 발명의 일 실시예에 따른 AST 풀(pool)의 형태를 도시하는 도면.
도 5a 내지 5c는 본 발명의 일 실시예에 따른 AST 및 노드 스트링 형태를 도시하는 도면.
도 6은 본 발명의 일 실시예에 따른 프로그램 유사도 평가를 위한 복제 검사 엔진의 동작 흐름도.
도 7은 본 발명의 일 실시예에 따른 복수의 프로그램 소스 파일의 그룹화를 도시하는 개략도.
도 8은 도 7에 도시된 그룹화의 동작 수행을 설명하기 위한 개략도.

Claims (9)

  1. 컴퓨터 프로그램의 복제 여부를 검사하는 방법으로서,
    제1 및 제2 프로그램 소스 파일을 입력받는 단계;
    상기 제1 및 제2 프로그램 소스 파일로부터 각각 그에 대응하는 제1 및 제2 추상 구문 트리(AST)를 생성하는 단계;
    상기 제1 및 제2 추상 구문 트리를 언파싱하여 각각 그에 대응하는 제1 및 제2 노드 스트링을 구하는 단계; 및
    상기 제1 및 제2 노드 스트링을 비교하여 상기 제1 및 제2 프로그램 소스 파일의 유사도를 계산하는 단계
    를 포함하는 컴퓨터 프로그램의 복제 여부를 검사하는 방법.
  2. 제1항에 있어서,
    상기 유사도를 계산하는 단계에서는 상기 제1 노드 스트링의 길이, 상기 제2 노드 스트링의 길이 및 매칭되는 서브 스트링의 길이를 이용하는 것을 특징으로 하는 컴퓨터 프로그램의 복제 여부를 검사하는 방법.
  3. 제1항에 있어서,
    상기 유사도를 계산하는 단계는,
    상기 제1 및 제2 노드 스트링에서 매칭되는 서브 스트링을 찾는 단계;
    상기 매칭되는 서브 스트링의 길이가 소정의 임계치보다 큰 지 여부를 판단하는 단계; 및
    상기 제1 노드 스트링의 길이, 상기 제2 노드 스트링의 길이 및 상기 매칭되는 서브 스트링의 길이를 이용하여 상기 제1 및 제2 프로그램 소스 파일의 유사도를 계산하는 단계
    를 포함하는 것을 특징으로 하는 컴퓨터 프로그램의 복제 여부를 검사하는 방법.
  4. 제2항에 있어서,
    상기 제1 및 제2 노드 스트링을 구하는 단계는 "infix", "prefix", "postfix" 방법 중 한가지 방법을 이용하여 구현되는 것을 특징으로 하는 컴퓨터 프로그램의 복제 여부를 검사하는 방법.
  5. 컴퓨터로 구현된 프로그램의 복제 여부를 검사하는 방법으로서,
    2 이상의 프로그램 소스 파일들을 입력받는 단계;
    상기 2 이상의 프로그램 소스 파일들로부터 각각 그에 대응하는 추상 구문 트리(AST)들을 생성하는 단계;
    상기 추상 구문 트리들을 언파싱하여 각각 그에 대응하는 노드 스트링들을 구하는 단계;
    상기 노드 스트링들을 비교하여 상기 2 이상의 프로그램 소스 파일들의 유사도를 계산하는 단계
    를 포함하고,
    상기 유사도를 계산하는 단계는 소정 유사도 이상의 유사도를 갖는 프로그램 소스 파일들의 그룹화를 통하여 이루어지는 것을 특징으로 하는 컴퓨터 프로그램의 복제 여부를 검사하는 방법.
  6. 제5항에 있어서,
    상기 유사도를 계산하는 단계에서는 상기 노드 스트링들의 길이 및 매칭되는 서브 스트링의 길이를 이용하는 것을 특징으로 하는 컴퓨터 프로그램의 복제 여부를 검사하는 방법.
  7. 제1항 내지 제6항 중 어느 한 항의 방법을 수행하기 위한 프로그램을 기록한 컴퓨터로 판독가능한 기록매체.
  8. 컴퓨터 프로그램의 복제 여부를 검사하는 시스템으로서,
    제1 및 제2 프로그램 소스 파일을 입력받는 입력 수단;
    상기 제1 및 제2 프로그램 소스 파일로부터 각각 그에 대응하는 제1 및 제2 추상 구문 트리(AST)를 생성하는 구문 분석기;
    상기 제1 및 제2 추상 구문 트리를 언파싱하여 각각 그에 대응하는 제1 및 제2 노드 스트링을 구하는 언파서(unparser); 및
    상기 제1 및 제2 노드 스트링을 비교하여 상기 제1 및 제2 프로그램 소스 파일의 유사도를 계산하는 복제 검사 엔진
    를 포함하는 컴퓨터 프로그램의 복제 여부를 검사하는 시스템.
  9. 제8항에 있어서,
    상기 복제 검사 엔진은 상기 제1 노드 스트링의 길이, 상기 제2 노드 스트링의 길이 및 매칭되는 서브 스트링의 길이를 이용하는 것을 특징으로 하는 컴퓨터 프로그램의 복제 여부를 검사하는 시스템.
KR1020030096642A 2003-12-24 2003-12-24 프로그램의 복제 여부를 검사하는 방법 및 시스템 KR20050065015A (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020030096642A KR20050065015A (ko) 2003-12-24 2003-12-24 프로그램의 복제 여부를 검사하는 방법 및 시스템

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020030096642A KR20050065015A (ko) 2003-12-24 2003-12-24 프로그램의 복제 여부를 검사하는 방법 및 시스템

Publications (1)

Publication Number Publication Date
KR20050065015A true KR20050065015A (ko) 2005-06-29

Family

ID=37256564

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020030096642A KR20050065015A (ko) 2003-12-24 2003-12-24 프로그램의 복제 여부를 검사하는 방법 및 시스템

Country Status (1)

Country Link
KR (1) KR20050065015A (ko)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100572660B1 (ko) * 2004-06-30 2006-04-24 부산대학교 산학협력단 프로그램 소스의 표절 탐색 방법 및 이를 이용한프로그래밍 과제의 채점 시스템
KR101214893B1 (ko) * 2011-12-16 2013-01-09 주식회사 안랩 어플리케이션의 유사성 검출 장치 및 방법
KR20200080104A (ko) * 2018-12-26 2020-07-06 한양대학교 에리카산학협력단 서로 다른 언어로 작성된 프로그램들 간 유사성 검사 방법 및 장치
CN112148609A (zh) * 2020-09-28 2020-12-29 南京大学 一种对于在线编程考试中所提交的代码的度量方法
KR20220067366A (ko) * 2020-11-17 2022-05-24 전북대학교산학협력단 프로그램 유지 보수 방법 및 이를 지원하는 컴퓨팅 장치

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100572660B1 (ko) * 2004-06-30 2006-04-24 부산대학교 산학협력단 프로그램 소스의 표절 탐색 방법 및 이를 이용한프로그래밍 과제의 채점 시스템
KR101214893B1 (ko) * 2011-12-16 2013-01-09 주식회사 안랩 어플리케이션의 유사성 검출 장치 및 방법
WO2013089340A1 (ko) * 2011-12-16 2013-06-20 주식회사 안랩 어플리케이션의 유사성 검출 장치 및 방법
KR20200080104A (ko) * 2018-12-26 2020-07-06 한양대학교 에리카산학협력단 서로 다른 언어로 작성된 프로그램들 간 유사성 검사 방법 및 장치
CN112148609A (zh) * 2020-09-28 2020-12-29 南京大学 一种对于在线编程考试中所提交的代码的度量方法
KR20220067366A (ko) * 2020-11-17 2022-05-24 전북대학교산학협력단 프로그램 유지 보수 방법 및 이를 지원하는 컴퓨팅 장치

Similar Documents

Publication Publication Date Title
CN108446540B (zh) 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统
Baker Parameterized duplication in strings: Algorithms and an application to software maintenance
Wahler et al. Clone detection in source code by frequent itemset techniques
CN105426711A (zh) 一种计算机软件源代码相似度检测方法
JPH1078959A (ja) エッジデータ構造を統一する方法
Brown et al. Clone detection and elimination for Haskell
Higo et al. Generating simpler ast edit scripts by considering copy-and-paste
JP2007026451A (ja) Xパスクエリーの処理方法
US11262988B2 (en) Method and system for using subroutine graphs for formal language processing
Solanki et al. Comparative study of software clone detection techniques
Paige Viewing a program transformation system at work
CN110737469A (zh) 一种功能粒度上基于语义信息的源代码相似度评估方法
CN113987405A (zh) 一种基于ast的数学表达式计算算法
Koskimies et al. The design of a language processor generator
KR20050065015A (ko) 프로그램의 복제 여부를 검사하는 방법 및 시스템
CN109032946B (zh) 一种测试方法和装置、计算机可读存储介质
JP2017204080A (ja) 情報処理装置、コンパイル方法及びコンパイラプログラム
Baker On finding duplication in strings and software
JP5600301B2 (ja) システム表現およびハンドリング技術
Ghosh et al. An empirical study of a hybrid code clone detection approach on java byte code
Breckel Error mining: Bug detection through comparison with large code databases
CN115879868B (zh) 一种专家系统与深度学习相融合的智能合约安全审计方法
Ly Normalizer: Augmenting Code Clone Detectors Using Source Code Normalization
Hansen Incremental clone detection for IDEs using dynamic suffix arrays
JP2006004145A (ja) プログラムコード生成装置

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E90F Notification of reason for final refusal
E601 Decision to refuse application