본문 바로가기

SW 아키텍처 이야기

특허 출원 이야기 : 부분 소스 코드의 컴파일 장치 및 방법

자바 언어의 정적 분석 도구들은 주로 소스를 분석하기도 하지만, 바이너리인 바이트코드 class 파일을 분석하는 경우가 많다. 소스를 분석하는 대표적 툴이 PMD이고, SpotBugs 같은 툴이 클래스를 분석하다. 또 Sonar Java Analyzer와 같은 툴을 둘 다 사용하기도 한다. 이 Sonar Java의 경우, 이전 버전에서는 소스만을 분석하다가 특정 버전부터 이후부터 클래스 파일도 같이 분석한다. 

정적 분석툴이 소스보다 클래스 파일을 활용하는 것은 아무래도 정확도가 높기 때문이다. 실제로 소스 기반 파서가 주는 정보보다 클래스 파서가 주는 정보가 많다. 정보가 많다는 것은 그만큼 정확한 분석이 더욱 가능하다는 것이다. 다만, 라인 정보와 같은 경우 클래스 파일에는 일부만 있다 보니 소스 분석을 같이 해야 정확한 라인 정보를 가져올 수 있다.

GitHub에서 만든 JavaParser(https://javaparser.org/)가 소스 파서로는 가장 유명하고, 바이트코드 파서는 ObjectWeb의 ASM(https://asm.ow2.io/)과 Apache의 BCEL(https://commons.apache.org/proper/commons-bcel/)이 많이 사용된다.

그럼 소스 기반 정적 분석의 장점은 뭘까? 아무래도 편리성인 것 같다. 컴파일된 클래스을 대부분 어렵지 않게 얻을 수 있지만, 많은 환경에서는 그렇지 않다. 특히, 빌드 환경이 복잡하고 오픈소스 라이브러리를 많이 사용하는 경우라면 더욱 그렇다, 소스의 일부만은 분석해야 하는 경우에도 전체를 빌드하는 것도 오버헤드가 된다.

만약 참조하는 라이브러리 없이 가지고 있는 소스만으로 컴파일을 할 수 있다면 어떨까? 정적 분석을 위해 주어진 소스만을 컴파일하고 생성된 클래스를 분석한다면 기존 소스 기반 분석툴의 장점을 가지게 될 것이다. 

그리고 이런 고민을 해결하고자 생각한 것이 "부분 소스 코드의 컴파일 장치 및 방법" 직무 발명이다. 18년도에 회사를 통해 출원을 했고, 올해 5월에 공개가 된 상태다. 참고로, 출원 이후 1년 6개월 후에 공개가 된다고 한다. 

핵심 아이디어는 주어진 소스를 분석하여 참조하는 클래스와 메소드 등 식별하고, 이를 더미(dummy)로 만들어 컴파일할 때에 사용하는 것이다. 주어진 소스에 대한 정적 분석이 목적이기에 실제로 동작하는 객체가 아닌 더미를 사용해도 전혀 문제가 되지 않는다.

더미(dummy)는 테스트 자동화를 위해 사용하는 Test Dobules 중에 하나로, 실제의 기능을 사용하기 않고 파라미터 전달 등에만 사용하기 위한 객체다. 그 외에도 Fake, Stub, Spy, Mock이 있다.

이 발명을 활용하면 변경된 소스만을 사용하여 잠재적 결함 분석을 손쉽게 할 수 있다. 형상에 변경된 코드 또는 GitHub의 PR(Pull Request) 등과 같이 일부만을 손쉽게 분석할 수 있어 기반을 제공한다. 

구체적인 구현에 대해서는 추후 기회가 되면 정리해 볼 예정이다.

특허 요약

대표 도면

부분 소스 코드의 컴파일 장치 및 방법이 개시된다. 예시적인 실시예에 따를 장치는, 부분 소스 코드를 파싱하고, 이로부터 소스 심볼 테이블 및 더미클래스 후보 리스트를 생성하는 소스 파싱 모듈; 상기 더미클래스 후보 리스트에 포함된 하나 이상의 더미클래스 후보 클래스들 중 실제 더미클래스 생성이 필요한 대상 클래스를 식별하는 타겟 식별 모듈; 식별된 상기 대상 클래스들의 정보를 획득하고, 이로부터 더미클래스 정보 리스트를 생성하는 더미클래스 정보 생성 모듈; 상기 더미클래스 정보 리스트를 참조하여 하나 이상의 더미클래스를 생성하는 더미클래스 작성 모듈; 및 생성된 상기 더미클래스를 이용하여 상기 부분 소스 코드에 대한 컴파일을 수행하는 컴파일 모듈을 포함한다.

Written with by Vincent Han