정적 분석 도구의 경우 CPD, PMD , FindBugs 및 Checkstyle을 자주 사용 합니다.
CPD는 PMD "복사 / 붙여 넣기 감지기"도구입니다. PMD 웹 페이지 에서 "중복 코드 찾기"링크 를 발견하기 전에 잠시 PMD를 사용하고있었습니다 .
이러한 도구는 때로 "기본"규칙 세트를 넘어서 확장 될 수 있음을 지적하고 싶습니다. 그리고 그것들이 오픈 소스이기 때문에 다시 작성할 수 있기 때문이 아닙니다. 이러한 도구 중 일부는 확장 할 수있는 응용 프로그램 또는 "후크"와 함께 제공됩니다. 예를 들어, PMD는 새 규칙을 만들 수 있는 "디자이너"도구 와 함께 제공됩니다 . 또한 Checkstyle에는 상당한 사용자 정의를 허용하는 속성 이있는 DescendantToken 검사가 있습니다.
이러한 도구를 Ant 기반 빌드 와 통합합니다 . 링크를 따라 가면 내 댓글 구성을 볼 수 있습니다.
빌드에 대한 간단한 통합 외에도 몇 가지 다른 방법으로 도구를 "통합"하도록 구성하는 것이 도움이됩니다. 즉, 보고서 생성 및 경고 억제 균일 성입니다. 이 토론에 이러한 측면을 추가하고 싶습니다 ( "정적 분석"태그도 있어야 함). 사람들은 "통합"솔루션을 만들기 위해 이러한 도구를 어떻게 구성하고 있습니까? ( 여기에서 별도로이 질문을했습니다 )
먼저 경고 보고서의 경우 각 경고가 간단한 형식을 갖도록 출력을 변환합니다.
/absolute-path/filename:line-number:column-number: warning(tool-name): message
이것은 종종 "Emacs 형식"이라고 불리지 만 Emacs를 사용하지 않더라도 보고서를 균질화하기위한 합리적인 형식입니다. 예를 들면 :
/project/src/com/example/Foo.java:425:9: warning(Checkstyle):Missing a Javadoc comment.
내 경고 형식 변환은 Ant 필터 체인이있는 Ant 스크립트에 의해 수행됩니다 .
내가하는 두 번째 "통합"은 경고 억제를위한 것입니다. 기본적으로 각 도구는 무시할 경고를 무시하기 위해 코드에 배치 할 수있는 주석 또는 주석 (또는 둘 다)을 지원합니다. 그러나 이러한 다양한 경고 억제 요청은 다소 어리석은 것처럼 보이는 일관된 모양이 아닙니다. 경고를 억제 할 때 경고를 억제하는 것이므로 항상 " SuppressWarning
?"를 작성하지 않는 이유는 무엇입니까?
예를 들어, PMD의 기본 구성 NOPMD
은 주석에 " " 문자열이 포함 된 코드 줄에서 경고 생성을 억제 합니다. 또한 PMD는 Java의 @SuppressWarnings
주석을 지원합니다 . PMD 억제 기능이 비슷하게 보이도록 SuppressWarning(PMD.
대신 " "이 포함 된 주석을 사용하도록 PMD를 구성합니다 NOPMD
. 주석 스타일 억제를 사용할 때 위반되는 특정 규칙을 입력합니다.
// SuppressWarnings(PMD.PreserveStackTrace) justification: (false positive) exceptions are chained
" SuppressWarnings(PMD.
"부분 만 주석에 중요하지만 @SuppressWarning
이름으로 개별 규칙 위반을 인식 하는 주석에 대한 PMD의 지원과 일치합니다 .
@SuppressWarnings("PMD.CompareObjectsWithEquals") // justification: identity comparision intended
마찬가지로 Checkstyle은 주석 쌍 사이의 경고 생성을 억제합니다 (주석 지원이 제공되지 않음). 기본적으로 Checkstyle을 끄고 켜는 주석에는 각각 CHECKSTYLE:OFF
및 문자열이 포함 CHECKSTYLE:ON
됩니다. 이 구성 (Checkstyle의 "SuppressionCommentFilter"사용)을 변경하여 " BEGIN SuppressWarnings(CheckStyle.
"및 " END SuppressWarnings(CheckStyle.
" 문자열을 사용 하면 컨트롤이 PMD와 비슷해 보입니다.
// BEGIN SuppressWarnings(Checkstyle.HiddenField) justification: "Effective Java," 2nd ed., Bloch, Item 2
// END SuppressWarnings(Checkstyle.HiddenField)
Checkstyle 주석을 사용하면 각 검사에 자체 " "주석 쌍이 있으므로 특정 검사 위반 ( HiddenField
) 이 중요 BEGIN/END
합니다.
FindBugs는 @SuppressWarnings
주석으로 경고 생성 억제도 지원 하므로 다른 도구와 일정 수준의 균일 성을 달성하기 위해 추가 구성이 필요하지 않습니다. 안타깝게도 Findbugs는 @SuppressWarnings
내장 된 Java @SuppressWarnings
주석이 SOURCE
FindBugs가 필요로하는 클래스 파일에서 주석을 유지할만큼 강력하지 않은 보존 정책을 가지고 있기 때문에 사용자 지정 주석 을 지원 해야합니다. Java의 @SuppressWarnings
주석 과 충돌하지 않도록 FindBugs 경고 억제를 완전히 제한합니다 .
@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
이러한 기술은 모든 도구에서 일관되게 일관되게 보입니다. 각 경고 억제에 문자열 " SuppressWarnings
"이 포함되어 있으면 전체 코드베이스에서 모든 도구에 대한 모든 인스턴스를 찾기 위해 간단한 검색을 쉽게 실행할 수 있습니다.