본문 바로가기
개발/WEB

이클립스에서 PMD 사용하기(전자정부 룰셋 적용) 씨큐어코딩(Secure Coding)

by Strong_옹이 2023. 1. 5.
728x90
반응형

이클립스에서 PMD 사용하기(전자정부 룰셋 적용) 씨큐어코딩

PMD란? 정적코드분석, JAVA 소스코드를 분석해 문제를 알려주는 오픈소스. 애플리케이션 코드 내에서 발견된 문제에 대해 보고하는 오픈소스 정적소스코드 분석기. PMD에는 기본제공 룰셋이 포함되어있으며 사용자 지정규칙을 작성하는 기능을 지원

 

1. 먼저 이클립스에서 PMD 설치

  - 이클립스 상단 Help -> Eclipse Marketplace... 클릭 

  - find에 pmd 검색후 pmd-eclipse-plugin 4.42.0 인스톨 버튼클릭 후 라이센스 동의후 설치완료

2. 전자정부프레임워크 룰셋 적용

  - 전자정부프레임워크 룰셋 다운로드 (전자정부프레임워크 사이트 다운로드 링크)

  - Eclipse IDE의 메뉴에서, Window > Preferences 선택

 - Preferences 창의 왼쪽 메뉴 구조에서, PMD > Rules Configuration 선택

  - Preferences 창에서, use global rule management 체크, ruleset 목록 전체선택후 우측의 Remove rules 아이콘 클릭

  - import ruleset 아이콘 클릭 

  - Browse버튼을 선택하여 미리 다운받는 개발환경에 맞는 룰셋 선택 후 OK버튼 선택 

 

3. 점검

  - Package Explorer 오른쪽 클릭 > PMD > Check Code

  - Package Explorer 오른쪽 클릭 > PMD > Genrate Reports 선택시 점검결과 보고서 저장

하단 Vio

  - 왼쪽 Violations Outline에서 오른쪽 클릭 후 show details 선택 시 오류 상세 확인

  - Mark as reviewed 선택 시 소스코드내 주석 추가

 

4. 점검결과 보고서 출력 양식변경

  - 점검후 보고서 출력시 결과 창(오류파일 경로, 파일명, 라인, 문제점)

 

5. 전자정부프레임워크 룰셋 점검항목

번호 룰이름 설명
01 EmptyCatchBlock 내용이 없는 Catch Block이 존재
02 EmptyIfStmt  빈 if 구문의 사용을 피하도록 함
03 EmptyWhileStmt 빈 while 구문이 사용되었음
04 EmptyTryBlock  내용이 없는 try 블록이 존재함
05 EmptyFinallyBlock  내용이 없는 finally 블록이 존재함
06 UnnecessaryConversionTemporary  기본 데이터 타입을 String으로 변환할 때 불필요한 임시 변환 작업을 피하도록 함
07 EmptyStatementNotInLoop  필요없는 문장 (;)이 있음
08 WhileLoopsMustUseBraces 중괄호없이 사용된 while문의 사용은 바람직하지 못한 코딩 습관임
09  AssignmentInOperand  피연산자내에 할당문이 사용됨. 해당 코드를 복잡하고 가독성이 떨어지게 만듬
10 UnnecessaryParentheses  괄호가 없어도 되는 상황에서 불필요한 괄호를 사용할 경우 마치 메소드 호출처럼 보여서 소스 코드의 가독성을 떨어뜨릴 수 있음
11 SimplifyBooleanExpressions  boolean 사용 시 불필요한 비교 연산을 피하도록 함
12 SwitchStmtsShouldHaveDefault Switch구문에는 반드시 default label이 있어야 함
13 AvoidReassigningParameters  넘겨받는 메소드 parameter 값을 직접 변경하는 코드 탐지.
14 FinalFieldCouldBeStatic  final field를 static으로 변경하면 overhead를 줄일 수 있음
15 EqualsNull  null 값과 비교하기 위해 equals 메소드를 사용하였음
16 SimpleDateFormatNeedsLocale  SimpleDateFormat 인스턴스를 생성할때 Locale 을 지정하는 것이 바람직함
17 ImmutableField  생성자를 통해 할당된 변수를 Final로 선언하지 않았음
18 AssignmentToNonFinalStatic  static 필드의 안전하지않은 사용 가능성이 존재
19 AvoidSynchronizedAtMethodLevel  mothod 레벨의 synchronization 보다 block 레벨 synchronization 을 사용하는 것이 바람직함
20 AbstractClassWithoutAbstractMethod  Abstract Class내에 Abstract Method가 존재하지 않음
21 UncommentedEmptyMethod  빈 메소드에 빈메소드임을 나타내는 주석을 추가할 것
22 AvoidConstantsInterface  Interface는 클래스의 behavior 을 구현하는 데에만 사용해야 함
23 DuplicateImports  import문이 중복 선언 되었음
24 ImportFromSamePackage  동일 패키지에 있을 때는 import문을 사용할 필요가 없음
25 SystemPrintln  System.out.print 가 사용됨. 전용 로거를 사용할 것을 권장
26 VariableNamingConventions  final이 아닌 변수는 밑줄을 포함할 수 없음
27 MisleadingVariableName  non-field 이름이 m_ 으로 시작함'
28 AvoidArrayLoops  배열의 값을 루프문을 이용하여 복사하는 것 보다, System.arraycopy() 메소드를 이용하여 복사하는 것이 효율적이며 수행 속도가 빠름
29 UnnecessaryWrapperObjectCreation  불필요한 Wrapper Object가 생성되었음. 탐지된 코드는 삭제하고, 별도의 parse관련 전용 메소드 사용을 권장
30 AvoidThrowingRawExceptionTypes  가공되지 않은 Exception을 throw하는 것은 비추천
31 AvoidThrowingNullPointerException  NullPointerException을 throw하는 것은 비추천
32 StringInstantiation  불필요한 String Instance를 생성하는 코드를 탐지. 간단한 형태의 코드로 변경 필요
33 StringToString  String 객체에서 toString()함수를 사용하는 것은 불필요함. 해당 코드 제거 필요
34 InefficientStringBuffering  StringBuffer 함수내에서 비문자열 연산 이용하여 직접 결합하는 코드 사용을 탐지. append 메소드 사용을 권장
35 InefficientEmptyStringCheck  빈 문자열 확인을 위해 String.trim().length() 을 사용하는 것은 피하도록 함. whitespace/Non-whitespace 확인을 위한 별도의 로직 구현을 권장
36 UselessStringValueOf  String 을 append 할 경우, String.valueOf 함수를 사용할 필요 없음
37 UnusedPrivateField  사용되지 않는 Private field의 탐지
38 UnusedPrivateMethod  사용되지 않는 Private Method 선언을 탐지
39 UnusedFormalParameter 메소드 선언 내에사용되지 않는 파라미터를 탐지
728x90
반응형

댓글