2011-09-27 7 views
8

Tôi đang cố gắng xem xét mã cho dự án của chúng tôi bằng FindBugs.FindBugs Cảnh báo RV_ABSOLUTE_VALUE_OF_RANDOM_INT

chúng ta có một phương pháp để tạo ra id duy nhất (ngẫu nhiên):

public static String generateUUID(int base){ 

    return String.valueOf(getCurrentTimeInNanos((long)base)) + 

        String.valueOf(Math.abs(random.nextInt())); 
} 

và FindBugs chỉ RV_ABSOLUTE_VALUE_OF_RANDOM_INT cảnh báo (RV: Xấu nỗ lực để tính giá trị tuyệt đối của chữ ký số nguyên ngẫu nhiên 32-bit), tôi đoán các vấn đề nằm trong số String.valueOf(Math.abs(random.nextInt()).

vì vậy nếu bạn có giải thích về lý do này và cách khắc phục?

cảm ơn.

Trả lời

18

Có lẽ đó là vì Math.abs can actually return negative results for integer inputs:

assertTrue(Math.abs(Integer.MIN_VALUE) < 0); 

Nó chỉ thực hiện điều này cho MIN_VALUE, tuy nhiên, vì -MIN_VALUE không thể được đại diện. Loại vấn đề tràn.

Đối với làm thế nào để sửa chữa nó:

  • không làm UUID của riêng bạn. Sử dụng java.util.UUID.

  • đúc các số ngẫu nhiên để lâu trước khi gọi Math.abs

  • sử dụng random.nextInt (Integer.MAX_VALUE) để có được một số từ 0 đến MAX_VALUE - 1