티스토리 뷰

안녕하세요. 오랜만에 글을 작성하게 됩니다. 오늘은 정적 분석 도구를 찾다가 오픈소스로 되어진 도구들 중에서 PMD에 대해서 간략하게 소개하고, 간단하게 사용하는 방법에 대해서 작성하려고합니다.

이러한 정적 분석 도구를 통해서 소스코드 또는 애플리케이션의 보안 취약점, 불필요한 소스 정보 등을 알 수 있으므로 필요 시 사용하는 것도 좋아 보여, 공유하게 되었습니다.

 

pmd 로고

(출처 : https://pmd.github.io/)

 

PMD란?

PMD(Programming Mistake Detector)는 응용 프로그램 코드에서 발견 된 문제를 보고 하는 오픈 소스 정적 Java 소스 코드 분석기 입니다. PMD에는 기본 제공 규칙 세트가 포함되어 있으며 사용자 지정 규칙을 작성할 수 있습니다.

(PMD는 올바른 형식의 소스 파일만 처리 할 수 있기 때문에 컴파일 오류를 보고하지 않습니다.)

 

 

요구사항

  • Java JRE, OpenJDK from Azul or AdoptOpenJDK 1.7 or higher.
  • 참고: Apex, JavaScript, Scala 또는 VisualForce를 분석하거나 Designer를 실행하려면 Java 8 이상이 필요합니다.
  • Zip archiver, e.g.:

참고: OpenJDK 또는 Java 11을 사용하여 Designer(./run.sh Designer)를 실행하려면 OpenJFX가 추가로 필요합니다. 다운로드하여 압축을 풀고 환경 변수 JAVAFX_HOME을 설정하시면 됩니다.

 

Installation

$ cd $HOME
$ wget https://github.com/pmd/pmd/releases/download/pmd_releases%2F6.50.0/pmd-bin-6.50.0.zip
$ unzip pmd-bin-6.50.0.zip
$ alias pmd="$HOME/pmd-bin-6.50.0/bin/run.sh pmd"
$ pmd -d /usr/src -R rulesets/java/quickstart.xml -f text

 

간편 사용법 (CLI)

커맨드라인 인터페이스(Command Line Interface)를 통해서 간단하게 아래와 같이 터미널에서도 작업을 진행 할 수 있습니다.

/bin/run.sh pmd -d {소스 또는 파일 위치} -f {포맷} -R category/java/codestyle.xml/UnnecessaryImport > unnecessaryImport.json

- 소스 또는 파일 위치 : Java 파일, 디렉토리 위치, zip 파일, jar 파일 사용 가능

- 위 커맨드 라인에서는 간단하게 파일 하나를 아래와 같이 Unnecessary(불필요한) 정보를 찾아주도록 테스트 해봤습니다.

커맨드라인은 아래의 도표를 참고하시면 돕니다.

옵션설명기본값에 적용

Option Description Default Value Applies to
--rulesets <refs>
-R <refs>
규칙 세트 또는 규칙 참조의 필수 쉼표로 구분된 목록입니다.    
       
--dir <path>
-d <path>
분석된 소스에 대한 필수 루트 디렉터리입니다.    
--format <format>
-f <format>
분석 보고서의 출력 형식입니다. 사용 가능한 형식은 여기 에 설명되어 있습니다 . text  
       
--aux-classpath <cp> 소스 코드에서 사용하는 라이브러리의 클래스 경로를 지정합니다. 이것은 소스 파일의 유형을 확인하는 데 사용됩니다. 플랫폼별 경로 구분 기호(Linux의 경우 ":", Windows의 경우 ";")는 항목을 구분하는 데 사용됩니다. file:또는 연속 행에 경로 요소가 포함된 텍스트 파일에 대한 단일 URL을 지정할 수 있습니다.   자바
--benchmark
-b
완료 시 벤치마크 보고서를 출력하는 벤치마크 모드를 활성화합니다. 보고서는 표준 오류로 전송됩니다.    
--cache <filepath> 증분 분석을 위한 캐시 파일의 위치를 ​​지정합니다. 이것은 원하는 파일 이름(상위 디렉토리뿐만 아니라)을 포함하여 파일의 전체 경로여야 합니다. 파일이 존재하지 않으면 처음 실행할 때 생성됩니다. 실행할 때마다 파일을 최신 규칙 위반으로 덮어씁니다. 이렇게 하면 분석 성능이 크게 향상될 수 있으므로 적극 권장 합니다.    
--debug
--verbose
-D
-V
디버그 모드. 더 많은 로그 출력을 인쇄합니다.    
--encoding <charset>
-e <charset>
PMD가 읽고 있는 소스 코드 파일의 문자 세트 인코딩을 지정합니다. 유효한 값은 의 표준 문자 집합입니다 java.nio.charset.Charset. UTF-8  
--fail-on-violation <bool> 위반이 발견되면 PMD가 0이 아닌 상태로 종료되는지 여부를 지정합니다. 기본적으로 PMD는 위반이 발견되면 상태 4로 종료됩니다. --fail-on-violation false대신 0으로 종료하고 보고서를 출력하려면 이 기능을 비활성화하십시오 . true  
--file-list <filepath> 분석할 파일 목록이 포함된 파일 경로(한 줄에 하나의 경로). 이 제공되면 제공할 필요가 없습니다 --dir.    
--force-language <lang> 파일 이름에 관계없이 모든 입력 파일에 언어를 강제로 사용합니다. 이 옵션을 사용하면 확장자에 의한 자동 언어 선택이 비활성화되고 PMD는 주어진 언어로 모든 파일을 구문 분석하려고 시도합니다 <lang>. 구문 분석 오류는 무시되고 구문 분석할 수 없는 파일은 건너뜁니다.이 옵션을 사용하면 xml을 확장자로 사용하지 않는 파일에 xml 언어를 사용할 수 있습니다. 아래 예를 참조하십시오 .    
--ignore-list <filepath> 무시할 파일 목록이 포함된 파일 경로(한 줄에 하나의 경로). --dir이 옵션은 및 와 함께 사용할 수 있습니다 --file-list. 이 무시 목록은 파일 목록의 모든 파일보다 우선합니다.    
--help
-h
-H
사용에 대한 도움말을 표시합니다.    
-language <lang>
-l <lang>
PMD가 사용해야 하는 언어를 지정합니다. 와 함께 사용됩니다 -version. 지원되는 언어 도 참조하십시오 .    
--minimum-priority <num>
-min <num>
규칙 우선 순위 임계값 여기에 구성된 것보다 우선순위가 낮은 규칙은 사용되지 않습니다. 5  
--no-ruleset-compatibility 잘못된 규칙 참조의 자동 수정을 비활성화합니다. 스위치가 없으면 PMD는 이동되거나 이름이 변경된 규칙을 가리키는 규칙 참조를 가능한 경우 새 위치로 자동으로 바꾸려고 시도합니다. 비활성화하는 것은 권장되지 않습니다.    
--no-cache 증분 분석을 명시적으로 비활성화합니다. 이 스위치는 증분 분석 사용에 대한 제안을 끄고 --cache옵션이 제공된 경우 해당 옵션이 삭제되도록 합니다.    
--property <name>=<value>
-P <name>=<value>
보고서 렌더러의 속성을 지정합니다. 옵션은 여러 번 지정할 수 있습니다. []  
--report-file <path>
-r <path>
보고서 출력이 기록되는 파일의 경로입니다. 파일이 없으면 생성됩니다. 이 옵션을 지정하지 않으면 보고서가 표준 출력으로 렌더링됩니다.    
--short-names 보고서에 단축된 파일 이름을 인쇄합니다.    
--show-suppressed 억제된 규칙 위반이 보고서에 추가되도록 합니다.    
--stress
-S
스트레스 테스트를 수행합니다.    
--suppress-marker <marker> PMD가 무시해야 하는 행을 표시하는 주석 토큰을 ​​지정합니다. NOPMD  
--threads <num>
-t <num>
PMD에서 사용하는 스레드 수를 설정합니다. 0다중 스레딩 처리를 비활성화 하려면 스레드를 로 설정하십시오 . 1  
--uri <uri>
-u <uri>
소스의 데이터베이스 URI입니다. 이 제공되면 제공할 필요가 없습니다 --dir.   PLSQL
--version 현재 버전의 PMD를 표시하고 분석을 수행하지 않고 종료합니다.    
-version <version>
-v <version>
PMD가 사용해야 하는 언어의 버전을 지정합니다. 와 함께 사용됩니다 -language. 지원되는 언어 도 참조하십시오 .    

 

결과

그 결과를 html로 내려 받아 페이지를 띄워서 확인해보시면 아래와 같습니다.

 

JAVA API 지원

pom.xml 파일에 아래와 같은 내용을 추가해서 Java 코드로도 구현이 될 수 있도록 JAVA API를 지원하고 있습니다.

<dependency>
    <groupId>net.sourceforge.pmd</groupId>
    <artifactId>pmd-java</artifactId>
    <version>${pmdVersion}</version>
</dependency>

자바 연동에 관련된 더 자세한 내용은 아래 링크를 참고하시면 됩니다.

 

참고자료

 

마치며

구글에서 검색을 해보다 보면 여러 가지의 오픈소스 정적 분석 도구들을 접할 수 있는데, PMD를 선정하여 소개를 드리게 된 이유로는 Github을 봤을 때, 현재에도 활발하게 개발이 진행되고 있고, 앞으로 어떠한 기능들이 추가될지에 대한 로드맵 공유도 되고 있는 점, JAVA, JSP, HTML, PLSQL, MAVEN 등의 다양한 규칙을 지원하며, 사용자 커스텀 룰 규칙을 등록하여 사용할 수 있다는 점, CLI 및 JAVA 등을 사용하여 프로젝트에 내장하여 사용할 수 있다는 점, 정적 분석 후 결과 데이터를 다양한 포맷(XML, HTML, JSON, etc)으로 유용하게 사용이 가능하다는 점을 고려하여 선택하게 되었습니다. 앞으로도 더욱 유용한 오픈소스에 대해서 찾아보고 사용해보면서 공유할 수 있도록 하겠습니다. 아무래도 오픈소스이다 보니 현업에서 사용을 하실 때에는 검증을 통해서 해당 환경에 맞는 솔루션인지 확인을 하고 사용할 것을 추천드리며, 위에서 소개드린 기능 보다 더 많은 기능들도 있으니 심도 있게 테스트해보시길 권장드립니다.

이것으로 오픈소스 정적 분석 도구 PMD에 대한 포스팅을 마치도록 하겠습니다.