Đối với các công cụ phân tích tĩnh, tôi thường sử dụng CPD, PMD , FindBugs và Checkstyle .
CPD là công cụ "Sao chép / Dán dò" PMD. Tôi đã sử dụng PMD một thời gian trước khi tôi nhận thấy liên kết "Tìm mã trùng lặp" trên trang web PMD .
Tôi muốn chỉ ra rằng các công cụ này đôi khi có thể được mở rộng ra ngoài bộ quy tắc "ngoài luồng" của chúng. Và không chỉ vì chúng là nguồn mở để bạn có thể viết lại chúng. Một số công cụ này đi kèm với các ứng dụng hoặc "móc" cho phép chúng được mở rộng. Ví dụ: PMD đi kèm với công cụ "designer" cho phép bạn tạo các quy tắc mới. Ngoài ra, Checkstyle có kiểm tra DescendantToken có các thuộc tính cho phép tùy chỉnh đáng kể.
Tôi tích hợp các công cụ này với bản dựng dựa trên Ant . Bạn có thể theo liên kết để xem cấu hình nhận xét của tôi.
Ngoài việc tích hợp đơn giản vào bản dựng, tôi thấy hữu ích khi định cấu hình các công cụ được "tích hợp" theo một số cách khác. Cụ thể, tạo báo cáo và thống nhất đàn áp cảnh báo. Tôi muốn thêm các khía cạnh này vào cuộc thảo luận này (có lẽ cũng nên có thẻ "phân tích tĩnh"): làm thế nào mọi người định cấu hình các công cụ này để tạo ra một giải pháp "hợp nhất"? (Tôi đã hỏi riêng câu hỏi này ở đây )
Đầu tiên, đối với các báo cáo cảnh báo, tôi chuyển đổi đầu ra để mỗi cảnh báo có định dạng đơn giản:
/absolute-path/filename:line-number:column-number: warning(tool-name): message
Đây thường được gọi là "định dạng Emacs", nhưng ngay cả khi bạn không sử dụng Emacs, đây là định dạng hợp lý để báo cáo đồng nhất. Ví dụ:
/project/src/com/example/Foo.java:425:9: warning(Checkstyle):Missing a Javadoc comment.
Chuyển đổi định dạng cảnh báo của tôi được thực hiện bởi tập lệnh Ant của tôi với bộ lọc Ant .
"Tích hợp" thứ hai mà tôi làm là để ngăn chặn cảnh báo. Theo mặc định, mỗi công cụ hỗ trợ nhận xét hoặc chú thích (hoặc cả hai) mà bạn có thể đặt trong mã của mình để tắt tiếng cảnh báo mà bạn muốn bỏ qua. Nhưng những yêu cầu đàn áp cảnh báo khác nhau này không có một cái nhìn nhất quán mà có vẻ hơi ngớ ngẩn. Khi bạn đang ngăn chặn một cảnh báo, bạn đang ngăn chặn một cảnh báo, vậy tại sao không luôn luôn viết " SuppressWarning
?"
Ví dụ: cấu hình mặc định của PMD ngăn chặn việc tạo cảnh báo trên các dòng mã với chuỗi " NOPMD
" trong một nhận xét. Ngoài ra, PMD hỗ trợ @SuppressWarnings
chú thích của Java . Tôi định cấu hình PMD để sử dụng các bình luận có chứa " SuppressWarning(PMD.
" thay vì NOPMD
vậy để các triệt tiêu PMD trông giống nhau. Tôi điền vào quy tắc cụ thể bị vi phạm khi sử dụng triệt tiêu kiểu nhận xét:
// SuppressWarnings(PMD.PreserveStackTrace) justification: (false positive) exceptions are chained
Chỉ phần " SuppressWarnings(PMD.
" mới có ý nghĩa đối với một nhận xét, nhưng nó phù hợp với sự hỗ trợ của PMD cho @SuppressWarning
chú thích nhận ra các vi phạm quy tắc riêng lẻ theo tên:
@SuppressWarnings("PMD.CompareObjectsWithEquals") // justification: identity comparision intended
Tương tự, Checkstyle ngăn chặn việc tạo cảnh báo giữa các cặp ý kiến (không hỗ trợ chú thích). Theo mặc định, các bình luận để tắt và bật Checkstyle chứa các chuỗi CHECKSTYLE:OFF
và CHECKSTYLE:ON
, tương ứng. Thay đổi cấu hình này (với "SuppressionVerFilter" của Checkstyle để sử dụng các chuỗi " BEGIN SuppressWarnings(CheckStyle.
" và " END SuppressWarnings(CheckStyle.
" làm cho các điều khiển trông giống như PMD:
// BEGIN SuppressWarnings(Checkstyle.HiddenField) justification: "Effective Java," 2nd ed., Bloch, Item 2
// END SuppressWarnings(Checkstyle.HiddenField)
Với các nhận xét của Checkstyle, vi phạm kiểm tra cụ thể ( HiddenField
) rất quan trọng vì mỗi kiểm tra có BEGIN/END
cặp nhận xét " " riêng .
FindBugs cũng hỗ trợ triệt tiêu thế hệ cảnh báo bằng @SuppressWarnings
chú thích, do đó không cần cấu hình thêm để đạt được mức độ đồng nhất với các công cụ khác. Thật không may, Findbugs phải hỗ trợ @SuppressWarnings
chú thích tùy chỉnh vì chú thích Java tích hợp @SuppressWarnings
có SOURCE
chính sách lưu giữ không đủ mạnh để giữ chú thích trong tệp lớp nơi FindBugs cần. Tôi hoàn toàn đủ điều kiện ngăn chặn các cảnh báo của FindBugs để tránh xung đột với @SuppressWarnings
chú thích của Java :
@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
Những kỹ thuật này làm cho mọi thứ trông hợp lý nhất quán trên các công cụ. Lưu ý rằng việc mỗi lần triệt tiêu cảnh báo có chứa chuỗi " SuppressWarnings
" giúp dễ dàng thực hiện một tìm kiếm đơn giản để tìm tất cả các phiên bản cho tất cả các công cụ trên toàn bộ cơ sở mã.