2010-06-01 49 views
7

Gần đây tôi đã bắt đầu sử dụng công cụ phân tích tĩnh tìm kiếm trong một bản dựng java mà tôi đang thực hiện. Báo cáo đầu tiên đã trở lại với vô số cảnh báo Mức độ ưu tiên cao. Là loại người ám ảnh, tôi đã sẵn sàng để đánh bật tất cả chúng ra. Tuy nhiên, tôi phải thiếu một cái gì đó. Tôi nhận được hầu hết các cảnh báo khi so sánh mọi thứ. Chẳng hạn như mã sau:Findbugs và so sánh

public void setSpacesPerLevel(int value) 
    { 
     if(value >= 0) 
     { 
     spacesPerLevel = value; 
     } 
     else 
     { 
     spacesPerLevel = 0; 
     } 
    } 

cảnh báo mức độ ưu tiên cao tại câu lệnh if.

File: Indenter.java, Line: 60, Loại: BIT_AND_ZZ, ưu tiên: Cao, Thể loại: đúng đắn Kiểm tra xem if ((...) & 0) == 0 trong mẫu. Indenter.setSpacesPerLevel (int)

Tôi so sánh int với int, có vẻ như là một điều phổ biến. Tôi nhận được khá nhiều loại lỗi đó với các so sánh đơn giản tương tự.

Tôi có rất nhiều cảnh báo ưu tiên cao khác về những gì dường như là các khối mã đơn giản. Am i thiếu cái gì ở đây? Tôi nhận ra rằng phân tích tĩnh có thể tạo ra các mặt tích cực sai, nhưng các lỗi mà tôi thấy có vẻ quá tầm thường của một trường hợp là dương tính giả.

Điều này khiến tôi gãi đầu.

for(int spaces = 0;spaces < spacesPerLevel;spaces++) 
    { 
     result = result.concat(" "); 
    } 

Mà cho các FindBugs sau cảnh báo:

File: Indenter.java, Line: 160, Type: IL_INFINITE_LOOP, Priority: High, Category: CORRECTNESS 

There is an apparent infinite loop in sample.Indenter.indent() 

This loop doesn't seem to have a way to terminate (other than by perhaps throwing an exception). 

Bất kỳ ý tưởng?

Vì vậy, về cơ bản tôi có một số tệp và 50-60 cảnh báo ưu tiên cao tương tự như các cảnh báo ở trên. Tôi đang sử dụng FindBugs 1.3.9 và gọi đó là từ FindBugs lệnh ant

UPDATE: Tôi đã xây dựng này được thực hiện bởi một máy chủ hudson và có mã đang được instrumented bởi Clover cho mã số bảo hiểm. Khi tôi tắt nó đi, tất cả các cảnh báo ưu tiên cao của tôi biến mất. Điều đó có ý nghĩa bây giờ. Cảm ơn vì bạn đã phản hồi.

+0

Đây có thể là vòng lặp vô hạn nếu bạn thay đổi khoảng trắngPerLevel bên trong vòng lặp ví dụ: spacesPerLevel = dấu cách + 2; hoặc giảm không gian. – Anton

+0

Chỉ cần cập nhật câu hỏi để chứa nhiều đoạn mã –

+0

Bạn có đang biên dịch với thông tin gỡ lỗi không? – Anton

Trả lời

7

CẬP NHẬT: Tôi có bản dựng này đang được thực thi bởi một máy chủ hudson và đã có mã được Clover thiết kế để bảo vệ mã. Khi tôi tắt nó đi, tất cả các cảnh báo ưu tiên cao của tôi biến mất. Điều đó có ý nghĩa bây giờ. Cảm ơn vì bạn đã phản hồi.

1

Bạn có đang chạy Findbugs thông qua plugin, kiến ​​hoặc gui của Eclipse không? là nó có thể là mã đã không biên dịch lại kể từ khi bạn chạy nó (trước khi thực hiện thay đổi)?

nếu setSpacesPerLevel không quá dài, gửi đầu ra của

javap -v TheClassThatContainssetSpacerPerLevel

Đối với lỗi thứ hai, bạn sẽ phải hiển thị toàn bộ vòng lặp trước khi người ta có thể nói nếu đó là vấn đề.

+0

tôi đang chạy nó từ ant. Mục tiêu làm sạch trước khi thực hiện bất kỳ phân tích xây dựng hoặc tĩnh nào. Làm việc trên đầu ra javap ... –

3

Một lưu ý phụ:

for(int spaces = 0;spaces < spacesPerLevel;spaces++) 
{ 
    result = result.concat(" "); 
} 

Nếu result là một java.lang.String, điều này có thể không hiệu quả, như bạn làm theo các bước sau cho mỗi nhân vật không gian:

  1. Tạo mới char[] để giữ kết quả của việc ghép nối
  2. tạo một thể hiện java.lang.String mới được quấn quanh mảng ký tự

Nếu bạn làm điều này nhiều lần, đặc biệt là khi result đã lâu, quá trình này mất rất nhiều thời gian.

Nếu hiệu suất (cả thời gian và bộ nhớ) quan trọng đối với phương pháp đó, bạn nên cân nhắc sử dụng StringBuilder (không an toàn chỉ với chủ đề) hoặc StringBuffer (chỉ an toàn).

+0

Cảm ơn! Tôi chuyển mã này từ .NET (Tôi là một chút gỉ trong bộ phận java). Có một hàm tạo trên lớp .net String mà chúng ta đang sử dụng cho phép bạn lặp lại một số ký tự X lần. Đây là giải pháp nhanh chóng và bẩn thỉu của tôi, nhưng nó đã hoàn toàn sai lệch ngay từ đầu. Cảm ơn! –