FindBugs質量管理

奔跑的鹏腾發表於2024-07-29

1. FindBugs是什麼

FindBugs 是一個靜態分析工具,它檢查類或者 JAR 檔案,將位元組碼與一組缺陷模式進行對比以發現可能的問題。有了靜態分析工具,就可以在不實際執行程式的情況對軟體進行分析。

FindBugs就是對編譯後的class進行掃描,以發現一些隱藏的bug。如果你擁有這些.class檔對應的程式碼檔案,可把這些原始碼檔案再選上,這樣便可以從稍後得出的報告中快捷的定位到出問題的程式碼上面。此外,還可以選上工程所使用的library,這樣似乎可以幫助FindBugs做一些高階的檢查,以發現一些更深層的bug。

2. FindBugs的作用

使用FindBugs一般建議是在開發階段,在這個階段將 FindBugs 加入到編譯過程中,可以儘可能早地在進行編譯時發現問題,從而保證保證專案研發質量。尤其當團隊擴大,並且不可避免地在專案中加入更多新開發人員時,FindBugs 可以作為一個安全網,檢測出已經識別的缺陷模式。如果讓一定數量的開發人員共同工作,那麼在程式碼中就會出現缺陷。像 FindBugs 這樣的工具當然不會找出所有的缺陷,但是它們會幫助找出其中的部分。

一旦確定了加入哪些過濾器和類,執行 FindBugs 就沒什麼成本了,而帶來的好處就是它會檢測出新缺陷。如果編寫特定於應用程式的檢測器,則這個好處可能更大。

3. FindBugs的使用

FindBugs的使用一般分為獨立使用和整合使用,獨立使用是指單獨安裝FindBugs程式,然後在命令列或其他流程中全套使用,如DevOps平臺。嵌入使用一般是與開發工具或整合工具使用,如eclipseideaJenkins等。

4. FindBugs規則分類

FindBugs的規則在3.0.1版本中一共有453個,規則分為八類,分別為:

l Bad practice:不好的實踐方面的

l Correctness:正確性方面的

l Internationalization:國際化的方面的

l Malicious code vulnerability:存在漏洞的有害程式碼方面的

l Multithreaded correctness:多執行緒正確性方面的

l Performance:效能 方面的

l Security:安全方面的

l Dodgy code:不可靠程式碼方面的

5. FindBugs規則詳情

規格分類英文

錯誤碼

錯誤規則

中文翻譯

Bad practice

AM_CREATES_EMPTY_JAR_FILE_ENTRY

AM: Creates an empty jar file entry

呼叫putNextEntry()方法寫入新的 jar 檔案條目時立即呼叫closeEntry()方法。這樣會造成JarFile條目為空。

Bad practice

AM_CREATES_EMPTY_ZIP_FILE_ENTRY

AM: Creates an empty zip file entry

呼叫putNextEntry()方法寫入新的 zip 檔案條目時立即呼叫closeEntry()方法。這樣會造成ZipFile條目為空。

Bad practice

BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS

BC: Equals method should not assume anything about the type of its argument

equals(Object o)方法不能對引數o的型別做任何的假設。比較此物件與指定的物件。當且僅當該引數不為 null,並且是表示與此物件相同的型別的物件時,結果才為 true。

Bad practice

BIT_SIGNED_CHECK

BIT: Check for sign of bitwise operation

檢查位運算子執行是否合理
((event.detail & SWT.SELECTED) > 0)
If SWT.SELECTED is a negative number, this is a candidate for a bug. Even when SWT.SELECTED is not negative, it seems good practice to use '!= 0' instead of '> 0'.

Bad practice

CN_IDIOM

CN: Class implements Cloneable but does not define or use clone method

按照慣例,實現此介面的類應該使用公共方法重寫 Object.clone(它是受保護的),以獲得有關重寫此方法的詳細資訊。此介面不 包含 clone 方法。因此,因為某個物件實現了此介面就克隆它是不可能的,應該實現此介面的類應該使用公共方法重寫 Object.clone

Bad practice

CN_IDIOM_NO_SUPER_CALL

CN: clone method does not call super.clone()

一個非final型別的類定義了clone()方法而沒有呼叫super.clone()方法。例如:B擴充套件自A,如果B中clone方法呼叫了spuer.clone(),而A中的clone沒有呼叫spuer.clone(),就會造成結果型別不準確。要求A的clone方法中呼叫spuer.clone()方法。

Bad practice

CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE

CN: Class defines clone() but doesn't implement Cloneable

類中定義了clone方法但是它沒有實現Cloneable介面

Bad practice

CNT_ROUGH_CONSTANT_VALUE

CNT: Rough value of known constant found

建議使用預定義的庫常量以提高程式碼的清晰度和精度。

Bad practice

CO_ABSTRACT_SELF

Co: Abstract class defines covariant compareTo() method

抽象類中定義了多個compareTo()方法,正確的是覆寫Comparable中的compareTo方法,方法的引數為Object型別,如下例:
int compareTo(T o) 比較此物件與指定物件的順序。

Bad practice

CO_COMPARETO_INCORRECT_FLOATING

Co: compareTo()/compare() incorrectly handles float or double value

此方法使用如下模式比較雙值或浮點值:val1>val2?1:val1<val2-1 : 0. 此模式不適用於-0.0和NaN值,這可能會導致不正確的排序結果或集合損壞(如果將比較值用作鍵)。考慮使用Double.compare或Float.com.pare靜態方法,這些方法可以正確處理所有特殊情況。

Bad practice

CO_COMPARETO_RESULTS_MIN_VALUE

Co: compareTo()/compare() returns Integer.MIN_VALUE

在某些情況下,此compareTo或compare方法返回常量Integer。MIN_VALUE,這是一種異常糟糕的做法。compareTo的返回值唯一重要的是結果的符號。但人們有時會否定compareTo的返回值,以為這會否定結果的符號。它會的,除非返回的值是Integer。最小值。所以只需返回-1而不是Integer。最小值。

Bad practice

CO_SELF_NO_OBJECT

Co: Covariant compareTo() method defined

類中定義了多個compareTo()方法,正確的是覆寫Comparable中的compareTo方法,方法的引數為Object型別

Bad practice

DE_MIGHT_DROP

DE: Method might drop exception

方法可能丟擲異常

Bad practice

DE_MIGHT_IGNORE

DE: Method might ignore exception

方法可能忽略異常

Bad practice

DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS

DMI: Adding elements of an entry set may fail due to reuse of Entry objects

entrySet()方法被允許返回底層Map的檢視,在該檢視中,單個Entry物件在迭代過程中被重用並返回。從Java 1.6開始,IdentityHashMap和EnumMap都是這樣做的。當迭代這樣的Map時,Entry值只有在進入下一次迭代之前才有效。例如,如果您試圖將這樣一個entrySet傳遞給addAll方法,那麼事情就會嚴重出錯。

Bad practice

DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION

DMI: Don't use removeAll to clear a collection

不要用removeAll方法去clear一個集合

Bad practice

DM_EXIT

Dm: Method invokes System.exit(...)

在方法中呼叫System.exit(...)語句,考慮用RuntimeException來代替

Bad practice

DM_RUN_FINALIZERS_ON_EXIT

Dm: Method invokes dangerous method runFinalizersOnExit

在方法中呼叫了System.runFinalizersOnExit 或者Runtime.runFinalizersOnExit方法,因為這樣做是很危險的。

Bad practice

ES_COMPARING_PARAMETER_STRING_WITH_EQ

ES: Comparison of String parameter using == or !=

==或者!=方法去比較String型別的引數

Bad practice

ES_COMPARING_STRINGS_WITH_EQ

ES: Comparison of String objects using == or !=

==或者!=去比較String型別的物件

Bad practice

EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS

Eq: Equals checks for incompatible operand

equals方法檢查不一致的操作。兩個類根本就是父子關係而去呼叫equals方法去判讀物件是否相等。
public boolean equals(Object o) {
if (o instanceof Foo)
return name.equals(((Foo)o).name);
else if (o instanceof String)
return name.equals(o);
else return false;

Bad practice

EQ_COMPARETO_USE_OBJECT_EQUALS

Eq: Class defines compareTo(...) and uses Object.equals()

類中定義了compareTo方法但是繼承了Object中的compareTo方法

Bad practice

EQ_GETCLASS_AND_CLASS_CONSTANT

Eq: equals method fails for subtypes

類中的equals方法可能被子類中的方法所破壞,當使用類似於Foo.class == o.getClass()的判斷時考慮用this.getClass() == o.getClass()來替換

Bad practice

EQ_SELF_NO_OBJECT

Eq: Covariant equals() method defined

類中定義了多個equals方法。正確的做法是覆寫Object中的equals方法,它的引數為Object型別的物件。

Bad practice

FI_EMPTY

FI: Empty finalizer should be deleted

為空的finalizer方法應該刪除。一下關於finalizer的內容省略

Bad practice

HE_EQUALS_NO_HASHCODE

HE: Class defines equals() but not hashCode()

方法定義了equals方法卻沒有定義hashCode方法

Bad practice

HE_HASHCODE_NO_EQUALS

HE: Class defines hashCode() but not equals()

類定義了hashCode方法去沒有定義equal方法

Bad practice

HE_EQUALS_USE_HASHCODE

HE: Class defines hashCode() and uses Object.equals()

一個類覆寫了equals方法,沒有覆寫hashCode方法,使用了Object物件的hashCode方法

Bad practice

HE_INHERITS_EQUALS_USE_HASHCODE

HE: Class inherits equals() and uses Object.hashCode()

子類繼承了父類的equals方法卻使用了Object的hashCode方法

Bad practice

IMSE_DONT_CATCH_IMSE

IMSE: Dubious catching of IllegalMonitorStateException

捕捉違法的監控狀態異常,例如當沒有獲取到物件鎖時使用其wait和notify方法

Bad practice

ISC_INSTANTIATE_STATIC_CLASS

ISC: Needless instantiation of class that only supplies static methods

為使用靜態方法而建立一個例項物件。呼叫靜態方法時只需要使用類名+靜態方法名就可以了。

Bad practice

IT_NO_SUCH_ELEMENT

It: Iterator next() method can't throw NoSuchElementException

迭代器的next方法不能夠丟擲NoSuchElementException

Bad practice

J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION

J2EE: Store of non serializable object into HttpSession

HttpSession物件中儲存非連續的物件

Bad practice

JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS

JCIP: Fields of immutable classes should be final

The class is annotated with net.jcip.annotations.Immutable, and the rules for that annotation require that all fields are final. .

Bad practice

NP_BOOLEAN_RETURN_NULL

NP: Method with Boolean return type returns explicit null

返回值為boolean型別的方法直接返回null,這樣會導致空指標異常

Bad practice

NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT

NP: equals() method does not check for null argument

變數呼叫equals方法時沒有進行是否為null的判斷

Bad practice

NP_TOSTRING_COULD_RETURN_NULL

NP: toString method may return null

toString方法可能返回null

Bad practice

NM_CLASS_NAMING_CONVENTION

Nm: Class names should start with an upper case letter

類的名稱以大寫字母名稱開頭

Bad practice

NM_CLASS_NOT_EXCEPTION

Nm: Class is not derived from an Exception, even though it is named as such

類的名稱中含有Exception但是卻不是一個異常類的子類,這種名稱會造成混淆

Bad practice

NM_CONFUSING

Nm: Confusing method names

令人迷惑的方面命名

Bad practice

NM_FIELD_NAMING_CONVENTION

Nm: Field names should start with a lower case letter

final型別的欄位需要遵循駝峰命名原則

Bad practice

NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER

Nm: Use of identifier that is a keyword in later versions of Java

驗證是否是java預留關鍵字

Bad practice

NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER

Nm: Use of identifier that is a keyword in later versions of Java

驗證是否是java預留關鍵字

Bad practice

NM_METHOD_NAMING_CONVENTION

Nm: Method names should start with a lower case letter

方法名稱以小寫字母開頭

Bad practice

NM_SAME_SIMPLE_NAME_AS_INTERFACE

Nm: Class names shouldn't shadow simple name of implemented interface

實現同一介面實現類不能使用相同的名稱,即使它們位於不同的包中

Bad practice

NM_SAME_SIMPLE_NAME_AS_SUPERCLASS

Nm: Class names shouldn't shadow simple name of superclass

繼承同一父類的子類不能使用相同的名稱,即使它們位於不同的包中

Bad practice

NM_VERY_CONFUSING_INTENTIONAL

Nm: Very confusing method names (but perhaps intentional)

很容易混淆的方法命名,例如方法的名稱名稱使用使用大小寫來區別兩個不同的方法。

Bad practice

NM_WRONG_PACKAGE_INTENTIONAL

Nm: Method doesn't override method in superclass due to wrong package for parameter

由於錯誤引用了不同包中相同類名的物件而不能夠正確的覆寫父類中的方法
import alpha.Foo;
public class A {
public int f(Foo x) { return 17; }
}
import beta.Foo;
public class B extends A {
public int f(Foo x) { return 42; }
public int f(alpha.Foo x) { return 27; }
}

Bad practice

OBL_UNSATISFIED_OBLIGATION

ODR: Method may fail to close database resource

這種方法可能無法清除(關閉,處置)一個流,資料庫物件,或其他資源需要一個明確的清理行動。
一般來說,如果一個方法開啟一個流或其他資源,該方法應該使用try / finally塊來確保在方法返回之前流或資源已經被清除了。這種錯誤模式基本上和OS_OPEN_STREAM和ODR_OPEN_DATABASE_RESOURCE錯誤模式相同,但是是在不同在靜態分析技術。我們正為這個錯誤模式的效用收集反饋意見。

Bad practice

ODR_OPEN_DATABASE_RESOURCE

ODR: Method may fail to close database resource on exception

方法中可能存在關閉資料連線失敗的情況

Bad practice

OS_OPEN_STREAM

OS: Method may fail to close stream

方法中可能存在關閉流失敗的情況

Bad practice

OS_OPEN_STREAM_EXCEPTION_PATH

OS: Method may fail to close stream on exception

方法中可能存在關閉流時出現異常情況

Bad practice

RC_REF_COMPARISON_BAD_PRACTICE

RC: Suspicious reference comparison to constant

當兩者為不同型別的物件時使用equals方法來比較它們的值是否相等,而不是使用==方法。例如比較的兩者為java.lang.Integer, java.lang.Float

Bad practice

RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN

RC: Suspicious reference comparison of Boolean values

使用== 或者 !=運算子來比較兩個 Boolean型別的物件,建議使用equals方法。

Bad practice

RR_NOT_CHECKED

RR: Method ignores results of InputStream.read()

InputStream.read方法忽略返回的多個字元,如果對結果沒有檢查就沒法正確處理使用者讀取少量字元請求的情況。

Bad practice

SR_NOT_CHECKED

RR: Method ignores results of InputStream.skip()

InputStream.skip()方法忽略返回的多個字元,如果對結果沒有檢查就沒法正確處理使用者跳過少量字元請求的情況

Bad practice

RV_RETURN_VALUE_IGNORED_BAD_PRACTICE

RV: Method ignores exceptional return value

方法忽略返回值的異常資訊

Bad practice

SI_INSTANCE_BEFORE_FINALS_ASSIGNED

SI: Static initializer creates instance before all static final fields assigned

在所有的static final欄位賦值之前去使用靜態初始化的方法建立一個類的例項。

Bad practice

SE_BAD_FIELD_STORE

Se: Non-serializable value stored into instance field of a serializable class

非序列化的值儲存在宣告為序列化的的非序列化欄位中

Bad practice

SE_COMPARATOR_SHOULD_BE_SERIALIZABLE

Se: Comparator doesn't implement Serializable

Comparator介面沒有實現Serializable介面

Bad practice

SE_INNER_CLASS

Se: Serializable inner class

序列化內部類

Bad practice

SE_NONFINAL_SERIALVERSIONID

Se: serialVersionUID isn't final

關於UID類的檢查內容省略

Bad practice

SE_NO_SUITABLE_CONSTRUCTOR

Se: Class is Serializable but its superclass doesn't define a void constructor

子類序列化時父類沒有提供一個void的建構函式

Bad practice

SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION

Se: Class is Externalizable but doesn't define a void constructor

Externalizable 例項類沒有定義一個void型別的建構函式

Bad practice

SE_READ_RESOLVE_MUST_RETURN_OBJECT

Se: The readResolve method must be declared with a return type of Object.

readResolve從流中讀取類的一個例項,此方法必須宣告返回一個Object型別的物件

Bad practice

UI_INHERITANCE_UNSAFE_GETRESOURCE

UI: Usage of GetResource may be unsafe if class is extended

當一個類被子類繼承後不要使用this.getClass().getResource(...)來獲取資源

Correctness

BC_IMPOSSIBLE_CAST

BC: Impossible cast

不可能的類轉換,執行時會丟擲ClassCastException

Correctness

BC_IMPOSSIBLE_DOWNCAST

BC: Impossible downcast

父類在向下進行型別轉換時丟擲ClassCastException

Correctness

BC_IMPOSSIBLE_INSTANCEOF

BC: instanceof will always return false

採用instaneof方法進行比較時總是返回false。前提是保證它不是由於某些邏輯錯誤造成的。

Correctness

BIT_AND

BIT: Incompatible bit masks

錯誤的使用&位運算子,例如(e & C)

Correctness

BIT_AND_ZZ

BIT: Check to see if ((...) & 0) == 0

檢查恆等的邏輯錯誤

Correctness

BIT_IOR

BIT: Incompatible bit masks

錯誤的使用|位運算子,例如(e | C)

Correctness

BIT_SIGNED_CHECK_HIGH_BIT

BIT: Check for sign of bitwise operation

檢查邏輯運算子操作返回的標識。例如((event.detail & SWT.SELECTED) > 0),建議採用!=0代替>0

Correctness

BOA_BADLY_OVERRIDDEN_ADAPTER

BOA: Class overrides a method implemented in super class Adapter wrongly

子類錯誤的覆寫父類中用於適配監聽其他事件的方法,從而導致當觸發條件發生時不能被監聽者呼叫

Correctness

DLS_DEAD_STORE_OF_CLASS_LITERAL

DLS: Dead store of class literal

以類的字面名稱方式為一個欄位賦值後再也沒有去使用它,在1.4jdk中它會自動呼叫靜態的初始化方法,而在jdk1.5中卻不會去執行。

Correctness

DLS_OVERWRITTEN_INCREMENT

DLS: Overwritten increment

覆寫增量增加錯誤i = i++

Correctness

DMI_BAD_MONTH

DMI: Bad constant value for month

月份的錯誤常量值

Correctness

DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES

DMI: Collections should not contain themselves

集合沒有包含他們自己本身。

Correctness

DMI_INVOKING_HASHCODE_ON_ARRAY

DMI: Invocation of hashCode on an array

陣列直接使用hashCode方法來返回雜湊碼。
int [] a1 = new int[]{1,2,3,4};
System.out.println(a1.hashCode());
System.out.println(java.util.Arrays.hashCode(a1));

Correctness

DMI_VACUOUS_SELF_COLLECTION_CALL

DMI: Vacuous call to collections

集合的呼叫不能被感知。例如c.containsAll(c)總是返回true,而c.retainAll(c)的返回值不能被感知。

Correctness

DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION

Dm: Can't use reflection to check for presence of annotation without runtime retention

Unless an annotation has itself been annotated with @Retention(RetentionPolicy.RUNTIME), the annotation can't be observed using reflection (e.g., by using the isAnnotationPresent method). .

Correctness

EC_ARRAY_AND_NONARRAY

EC: equals() used to compare array and nonarray

陣列物件使用equals方法和非陣列物件進行比較。即使比較的雙方都是陣列物件也不應該使用equals方法,而應該比較它們的內容是否相等使用java.util.Arrays.equals(Object[], Object[]);

Correctness

EC_INCOMPATIBLE_ARRAY_COMPARE

EC: equals(...) used to compare incompatible arrays

使用equls方法去比較型別不相同的陣列。例如:String[] and StringBuffer[], or String[] and int[]

Correctness

EC_UNRELATED_CLASS_AND_INTERFACE

EC: Call to equals() comparing unrelated class and interface

使用equals方法比較不相關的類和介面

Correctness

EC_UNRELATED_INTERFACES

EC: Call to equals() comparing different interface types

呼叫equals方法比較不同型別的介面

Correctness

EC_UNRELATED_TYPES

EC: Call to equals() comparing different types

呼叫equals方法比較不同型別的類

Correctness

EC_UNRELATED_TYPES_USING_POINTER_EQUALITY

EC: Using pointer equality to compare different types

This method uses using pointer equality to compare two references that seem to be of different types. The result of this comparison will always be false at runtime.

Correctness

EQ_ALWAYS_FALSE

Eq: equals method always returns false

使用equals方法返回值總是false

Correctness

EQ_ALWAYS_TRUE

Eq: equals method always returns true

equals方法返回值總是true

Correctness

EQ_COMPARING_CLASS_NAMES

Eq: equals method compares class names rather than class objects

使用equals方法去比較一個類的例項和類的型別

Correctness

EQ_OTHER_NO_OBJECT

Eq: equals() method defined that doesn't override equals(Object)

類中定義的equals方法時不要覆寫equals(Object)方法

Correctness

EQ_OTHER_USE_OBJECT

Eq: equals() method defined that doesn't override Object.equals(Object)

類中定義的equals方法時不要覆寫Object中的equals(Object)方法

Correctness

EQ_SELF_USE_OBJECT

Eq: Covariant equals() method defined, Object.equals(Object) inherited

類中定義了一組equals方法,但是都是繼承的java.lang.Object class中的equals(Object)方法

Correctness

VA_FORMAT_STRING_BAD_ARGUMENT

FS: Format string placeholder incompatible with passed argument

錯誤使用引數型別來格式化字串

Correctness

VA_FORMAT_STRING_BAD_CONVERSION

FS: The type of a supplied argument doesn't match format specifier

指定的格式字串和引數型別不匹配,例如:String.format("%d", "1")

Correctness

VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_SUPPLIED

FS: MessageFormat supplied where printf style format expected

但用String的format方法時實際呼叫了MessageFormat中乾的格式化方法而引起格式化結果出錯。

Correctness

VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED

FS: More arguments are passed than are actually used in the format string

使用String的format方法時有非法的引數也經過了格式化操作。

Correctness

VA_FORMAT_STRING_ILLEGAL

FS: Illegal format string

格式化String物件語句錯誤

Correctness

VA_FORMAT_STRING_MISSING_ARGUMENT

FS: Format string references missing argument

String的format操作缺少必要的引數。

Correctness

VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT

FS: No previous argument for format string

格式字串定義錯誤,例如:formatter.format("%<s %s", "a", "b"); 丟擲MissingFormatArgumentException異常

Correctness

ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL

ICAST: Integral value cast to double and then passed to Math.ceil

integral的值轉換為double後使用了Math.ceil方法

Correctness

ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND

ICAST: int value cast to float and then passed to Math.round

int 型別的值轉換為float型別之後呼叫了Math.round方法

Correctness

IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD

IJU: JUnit assertion in run method will not be noticed by JUnit

JUnit中的斷言在run方法中不會被告知

Correctness

IJU_BAD_SUITE_METHOD

IJU: TestCase declares a bad suite method

在一個JUnit類中宣告的一個suite()方法必須宣告為
public static junit.framework.Test suite()
或者
public static junit.framework.TestSuite suite()的形式。

Correctness

IL_CONTAINER_ADDED_TO_ITSELF

IL: A collection is added to itself

集合本身作為add方法的引數,這樣會引起內容溢位。

Correctness

IL_INFINITE_LOOP

IL: An apparent infinite loop

方法的自呼叫引起的死迴圈

Correctness

IM_MULTIPLYING_RESULT_OF_IREM

IM: Integer multiply of result of integer remainder

和整數餘數進行乘法運算。例如:i % 60 * 1000 是進行(i % 60) * 1000運算而不是 i % (60 * 1000)

Correctness

INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE

INT: Bad comparison of nonnegative value with negative constant or zero

保證非負數和負數進行比較

Correctness

INT_BAD_COMPARISON_WITH_SIGNED_BYTE

INT: Bad comparison of signed byte

比較有符合數,要先把有符號數轉換為無符合數再進行比較

Correctness

IO_APPENDING_TO_OBJECT_OUTPUT_STREAM

IO: Doomed attempt to append to an object output stream

宣佈試圖在物件的輸出流處新增元素,如果你希望能夠新增進一個物件的輸出流中必須保證物件的輸出流處於開啟狀態。

Correctness

IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN

IP: A parameter is dead upon entry to a method but overwritten

傳入引數的值被忽略,但是對傳入值進行了修改,並返回給了呼叫者

Correctness

MF_CLASS_MASKS_FIELD

MF: Class defines field that masks a superclass field

子類中定義了和父類中同名的欄位。在呼叫時會出錯

Correctness

MF_METHOD_MASKS_FIELD

MF: Method defines a variable that obscures a field

在方法中定義的區域性變數和類變數或者父類變數同名,從而引起欄位混淆。

Correctness

NP_ALWAYS_NULL

NP: Null pointer dereference

物件賦為null值後 沒有被重新賦值

Correctness

NP_ALWAYS_NULL_EXCEPTION

NP: Null pointer dereference in method on exception path

空指標引用上呼叫去除引用方法,將發生空指標異常

Correctness

NP_ARGUMENT_MIGHT_BE_NULL

NP: Method does not check for null argument

方法沒有判斷引數是否為空

Correctness

NP_CLOSING_NULL

NP: close() invoked on a value that is always null

一個為空的物件呼叫close方法

Correctness

NP_GUARANTEED_DEREF

NP: Null value is guaranteed to be dereferenced

在正常的null判斷分支上,物件去除引用操作是受保護的不允許的

Correctness

NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH

NP: Value is null and guaranteed to be dereferenced on exception path

There is a statement or branch on an exception path that if executed guarantees that a value is null at this point, and that value that is guaranteed to be dereferenced (except on forward paths involving runtime exceptions).

Correctness

NP_NONNULL_PARAM_VIOLATION

NP: Method call passes null to a non-null parameter

方法中為null的引數沒有被重新賦值
void test(){
String ss = null;
sya(ss);
}
public void sya(String ad){
ad.getBytes();
}

Correctness

NP_NONNULL_RETURN_VIOLATION

NP: Method may return null, but is declared @Nonnull

方法宣告瞭返回值不能為空,但是方法中有可能返回null

Correctness

NP_NULL_INSTANCEOF

NP: A known null value is checked to see if it is an instance of a type

檢查一個為null的值是否是想要的型別物件,而不是由於粗心或者邏輯錯誤引起的

Correctness

NP_NULL_ON_SOME_PATH

NP: Possible null pointer dereference

物件可能沒有重新賦值

Correctness

NP_NULL_ON_SOME_PATH_EXCEPTION

NP: Possible null pointer dereference in method on exception path

在異常null值處理分支呼叫的方法上,可能存在物件去除引用操作

Correctness

NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS

NP: Method call passes null for non-null parameter

方法引數中宣告為nonnull型別的引數為null
void test(){
String ss = null;
sya(ss);
}
public void sya(@nonnull String ad){
ad.getBytes();
}

Correctness

NP_STORE_INTO_NONNULL_FIELD

NP: Store of null value into field annotated @Nonnull

為一個已經宣告為不能為null值的屬性賦值為null。

Correctness

NM_BAD_EQUAL

Nm: Class defines equal(Object); should it be equals(Object)?

類中定義了一個equal方法但是卻不是覆寫的Object物件的equals方法

Correctness

NM_LCASE_HASHCODE

Nm: Class defines hashcode(); should it be hashCode()?

類中定義了一個hashCode方法但是卻不是覆寫的Object中的hashCode方法

Correctness

NM_LCASE_TOSTRING

Nm: Class defines tostring(); should it be toString()?

類中定義了一個toString方法但是卻不是覆寫的Object中的toString方法

Correctness

NM_METHOD_CONSTRUCTOR_CONFUSION

Nm: Apparent method/constructor confusion

構造方法定義混亂,保證一個標準的建構函式。 例如:
SA(){ }
void SA(){
}

Correctness

NM_VERY_CONFUSING

Nm: Very confusing method names

混亂的方法命名,如getName和getname方法同時出現的時候

Correctness

NM_WRONG_PACKAGE

Nm: Method doesn't override method in superclass due to wrong package for parameter

方法因為取了不同包中的同名的物件而沒有正確覆寫父類中的同名方法
import alpha.Foo;
public class A {
public int f(Foo x) { return 17; }
}
----
import beta.Foo;
public class B extends A {
public int f(Foo x) { return 42; }
}

Correctness

QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT

QBA: Method assigns boolean literal in boolean expression

if或者while表示式中使用boolean型別的值時應該使用==去判斷,而不是採用=操作

Correctness

RC_REF_COMPARISON

RC: Suspicious reference comparison

比較兩個物件值是否相等時應該採用equals方法,而不是==方法

Correctness

RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION

RE: Invalid syntax for regular expression

對正規表示式使用了錯誤的語法,會丟擲未經檢查的異常,表明正規表示式模式中的語法錯誤。

Correctness

RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION

RE: File.separator used for regular expression

使用正規表示式使用了錯誤的檔案分隔符,在windows系統中正規表示式不會匹配’\’而應該使用'\\'

Correctness

RV_01_TO_INT

RV: Random value from 0 to 1 is coerced to the integer 0

0到1隨機值被強制為整數值0。在強制得到一個整數之前,你可能想得到多個隨機值。或使用Random.nextInt(n)的方法。

Correctness

RV_ABSOLUTE_VALUE_OF_HASHCODE

RV: Bad attempt to compute absolute value of signed 32-bit hashcode

此程式碼生成一個雜湊碼,然後計算該雜湊碼的絕對值。如果雜湊碼是Integer.MIN_VALUE的,那麼結果將是負數(因為Math.abs(Integer.MIN_VALUE的)== Integer.MIN_VALUE的)。
2^ 32值之外字串有一個Integer.MIN_VALUE的hashCode包括“polygenelubricants”,“GydZG_”和“,”DESIGNING WORKHOUSES “。

Correctness

RV_ABSOLUTE_VALUE_OF_RANDOM_INT

RV: Bad attempt to compute absolute value of signed random integer

此程式碼生成一個隨機的符號整數,然後計算該隨機整數的絕對值。如果隨機數生成數絕對值為Integer.MIN_VALUE的,那麼結果將是負數(因為Math.abs(Integer.MIN_VALUE的)== Integer.MIN_VALUE的)。

Correctness

RV_EXCEPTION_NOT_THROWN

RV: Exception created and dropped rather than thrown

此程式碼建立一個異常(或錯誤)的物件,但不會用它做任何事情。例如:if (x < 0)
new IllegalArgumentException("x must be nonnegative");
這可能是程式設計師的意圖丟擲建立的異常:
if (x < 0)
throw new IllegalArgumentException("x must be nonnegative");

Correctness

RpC_REPEATED_CONDITIONAL_TEST

RpC: Repeated conditional tests

該程式碼包含對同一個條件試驗了兩次,兩邊完全一樣例如:(如X == 0 | | x == 0)。可能第二次出現是打算判斷別的不同條件(如X == 0 | | y== 0)。

Correctness

SA_FIELD_SELF_ASSIGNMENT

SA: Self assignment of field

方法中包含自己對自己賦值的欄位。例如:
int x;
public void foo() {
x = x;
}

Correctness

SA_FIELD_SELF_COMPARISON

SA: Self comparison of field with itself

欄位自己進行自比較可能表明錯誤或邏輯錯誤。

Correctness

SA_LOCAL_SELF_COMPUTATION

SA: Nonsensical self computation involving a field (e.g., x & x)

此方法對同一變數執行了荒謬的計算(如x&x或x-x)操作。由於計算的性質,這一行動似乎沒有意義,並可能表明錯誤或邏輯錯誤。

Correctness

SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH

SF: Dead store due to switch statement fall through

swtich中先前的case值因為swtich執行失敗而被覆寫,這就像是忘記使用break推出或者沒有使用return語句放回先前的值一樣。

Correctness

SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_THROW

SF: Dead store due to switch statement fall through to throw

swtich中因為出現異常而忽略了對case值的儲存。

Correctness

SIC_THREADLOCAL_DEADLY_EMBRACE

SIC: Deadly embrace of non-static inner class and thread local

如果是一個靜態內部類。實際上,在內部類和當前執行緒有死鎖的可能。由於內部類不是靜態的,它保留了對外部類的引用。如果執行緒包含對一個內部類例項的引用,那麼內外例項的例項都可以被獲取,這樣就不具備垃圾會回收的資格。

Correctness

SIO_SUPERFLUOUS_INSTANCEOF

SIO: Unnecessary type check done using instanceof operator

在進行instanceof操作時進行沒有必要的型別檢查

Correctness

STI_INTERRUPTED_ON_CURRENTTHREAD

STI: Unneeded use of currentThread() call, to call interrupted()

此方法呼叫Thread.currentThread()呼叫,只需呼叫interrupted()方法。由於interrupted()是一個靜態方法, Thread.interrupted()更簡單易用。

Correctness

STI_INTERRUPTED_ON_UNKNOWNTHREAD

STI: Static Thread.interrupted() method invoked on thread instance

呼叫不是當前執行緒物件的Thread.interrupted()方法,由於interrupted()方法是靜態的,interrupted方法將會呼叫一個和作者原計劃不同的物件。

Correctness

SE_METHOD_MUST_BE_PRIVATE

Se: Method must be private in order for serialization to work

這個類實現了Serializable介面,並定義自定義序列化的方法/反序列化。但由於這種方法不能宣告為private,將被序列化/反序列化的API忽略掉。

Correctness

SE_READ_RESOLVE_IS_STATIC

Se: The readResolve method must not be declared as a static method.

為使readResolve方法得到序列化機制的識別,不能作為一個靜態方法來宣告。

Correctness

UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS

UMAC: Uncallable method defined in anonymous class

在匿名類中定義了一個既沒有覆寫超類中方法也不能直接呼叫的方法。因為在其他類的方法不能直接引用匿名類宣告的方法,似乎這種方法不能被呼叫,這種方法可能只是沒有任何作用的程式碼,但也可能覆寫超類中宣告。

Correctness

UR_UNINIT_READ

UR: Uninitialized read of field in constructor

此構造方法中使用了一個尚未賦值的欄位或屬性。
String a;
public SA() {
String abc = a;
System.out.println(abc);
}

Correctness

DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY

USELESS_STRING: Invocation of toString on an array

該程式碼呼叫上匿名陣列的toString()方法,產生的結果形如[@ 16f0472並沒有實際的意義。考慮使用Arrays.toString方法來轉換成可讀的字串,提供該陣列的內容陣列。例如:
String[] a = { "a" };
System.out.println(a.toString());
//正確的使用為
System.out.println(Arrays.toString(a));

Correctness

UWF_NULL_FIELD

UwF: Field only ever set to null

欄位的值總是為null值,所有讀取該欄位的值都為null。檢查錯誤,如果它確實沒有用就刪除掉。

Correctness

UWF_UNWRITTEN_FIELD

UwF: Unwritten field

此欄位是永遠不會寫入值。所有讀取將返回預設值。檢查錯誤(如果它被初始化?),如果它確實沒有用就刪除掉。

Internationalization

DM_CONVERT_CASE

Dm: Consider using Locale parameterized version of invoked method

使用平臺預設的編碼格式對字串進行大小寫轉換,這可能導致國際字元的轉換不當。使用以下方式對字元進行轉換
String.toUpperCase( Locale l )
String.toLowerCase( Locale l )

Malicious code vulnerability

DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED

DP: Classloaders should only be created inside doPrivileged block

類載入器只能建立在特殊的方法體內

Malicious code vulnerability

EI_EXPOSE_REP

EI: May expose internal representation by returning reference to mutable object

返回一個易變物件引用並把它儲存在物件欄位中時會暴露物件內部的欄位描述,如果接受不守信任的程式碼訪問或者沒有檢查就去改變易變物件的會涉及物件的安全和其他重要屬性的安全。返回一個物件的新副本,在很多情況下更好的辦法。

Malicious code vulnerability

EI_EXPOSE_REP2

EI2: May expose internal representation by incorporating reference to mutable object

此程式碼把外部可變物件引用儲存到物件的內部表示。如果例項受到不信任的程式碼的訪問和沒有檢查的變化危及物件和重要屬性的安全。儲存一個物件的副本,在很多情況下是更好的辦法。

Malicious code vulnerability

FI_PUBLIC_SHOULD_BE_PROTECTED

FI: Finalizer should be protected, not public

一個類中的finalize()方法必須宣告為protected,而不能為public型別

Malicious code vulnerability

MS_EXPOSE_REP

MS: Public static method may expose internal representation by returning array

一個public型別的靜態方法返回一個陣列,可能引用內部屬性的暴露。任何程式碼呼叫此方法都可以自由修改底層陣列。一個解決辦法是返回一個陣列的副本。

Malicious code vulnerability

MS_FINAL_PKGPROTECT

MS: Field should be both final and package protected

一個靜態欄位可能被惡意程式碼或另外一個包所改變的。欄位可以放到protected包中也可以定義為final型別的以避免此問題。

Malicious code vulnerability

MS_MUTABLE_ARRAY

MS: Field is a mutable array

一個定義為final型別的靜態欄位引用一個陣列時它可以被惡意程式碼或在另其他包中所使用。這些程式碼可以自由修改陣列的內容。

Malicious code vulnerability

MS_MUTABLE_HASHTABLE

MS: Field is a mutable Hashtable

一個定義為final型別的靜態欄位引用一個Hashtable時可以被惡意程式碼或者在其他包中被呼叫,這些方法可以修改Hashtable的值。

Malicious code vulnerability

MS_OOI_PKGPROTECT

MS: Field should be moved out of an interface and made package protected

將域儘量不要定義在介面中,並宣告為包保護在介面中定義了一個final型別的靜態欄位,如陣列或雜湊表等易變物件。這些物件可以被惡意程式碼或者在其他包中被呼叫,為了解決這個問題,需要把它定義到一個具體的實體類中並且宣告為保護型別以避免這種錯誤。

Malicious code vulnerability

MS_PKGPROTECT

MS: Field should be package protected

一個靜態欄位是可以改變的惡意程式碼或其他的包訪問修改。可以把這種型別的欄位宣告為final型別的以防止這種錯誤。

Multithreaded correctness

DM_MONITOR_WAIT_ON_CONDITION

Dm: Monitor wait() called on Condition

方法中以java.util.concurrent.locks.Condition物件呼叫wait()。等待一個條件發生時應該使用在Condition介面中定義的await()方法。

Multithreaded correctness

DM_USELESS_THREAD

Dm: A thread was created using the default empty run method

這個方法沒有透過run方法或者具體宣告Thread類,也沒有透過一個Runnable物件去定義一個執行緒,而這個執行緒出來浪費資源卻什麼也沒有去做。

Multithreaded correctness

ESync_EMPTY_SYNC

ESync: Empty synchronized block

該程式碼包含一個空的同步塊:synchronized() {}

Multithreaded correctness

IS2_INCONSISTENT_SYNC

IS: Inconsistent synchronization

不合理的同步

Multithreaded correctness

IS_FIELD_NOT_GUARDED

IS: Field not guarded against concurrent access

域不是良好的同步訪問---此欄位被標註為net.jcip.annotations.GuardedBy,但可以在某種程度上違反註釋而去訪問

Multithreaded correctness

JLM_JSR166_LOCK_MONITORENTER

JLM: Synchronization performed on Lock

實現java.util.concurrent.locks.Lock的物件呼叫了同步的方法。應該這樣處理,物件被鎖定/解鎖時使用acquire()/ release()方法而不是使用同步的方法。

Multithreaded correctness

LI_LAZY_INIT_STATIC

LI: Incorrect lazy initialization of static field

靜態域不正確的延遲初始化--
這種方法包含了一個不同步延遲初始化的非volatile靜態欄位。因為編譯器或處理器可能會重新排列指令,如果該方法可以被多個執行緒呼叫,執行緒不能保證看到一個完全初始化的物件。你可以讓欄位可變來解決此問題

Multithreaded correctness

LI_LAZY_INIT_UPDATE_STATIC

LI: Incorrect lazy initialization and update of static field

這種方法包含一個不同步延遲初始化的靜態欄位。之後為欄位賦值,物件儲存到該位置後進一步更新或訪問。欄位後儘快讓其他執行緒能夠訪問。如果該方法的進一步訪問該欄位為初始化物件提供服務,然後你有一個非常嚴重的多執行緒bug,除非別的東西阻止任何其他執行緒訪問儲存的物件,直到它完全初始化。即使你有信心,該方法是永遠不會被多個執行緒呼叫時,在它的值還沒有被充分初始化或移動,不把它設定為static欄位時它可能會更好。

Multithreaded correctness

ML_SYNC_ON_UPDATED_FIELD

ML: Method synchronizes on an updated field

物件獲取一個可變欄位時進行同步。這是沒有意義的,因為不同的執行緒可以在不同的物件同步。

Multithreaded correctness

MSF_MUTABLE_SERVLET_FIELD

MSF: Mutable servlet field

一個web服務一般只能建立一個servlet或者jsp的例項(例如:treates是一個單利類),它會被多個執行緒呼叫這個例項的方法服務於多個同時的請求。因此使用易變的欄位屬性產生競爭的情況。

Multithreaded correctness

MWN_MISMATCHED_NOTIFY

MWN: Mismatched notify()

此方法呼叫Object.notify()或Object.notifyAll()而沒有獲取到該物件的物件鎖。呼叫notify()或notifyAll()而沒有持有該物件的物件鎖,將導致IllegalMonitorStateException異常。

Multithreaded correctness

MWN_MISMATCHED_WAIT

MWN: Mismatched wait()

此方法呼叫Object.wait()而沒有獲取到該物件的物件鎖。呼叫wait()而沒有持有該物件的物件鎖,將導致IllegalMonitorStateException異常。

Multithreaded correctness

NP_SYNC_AND_NULL_CHECK_FIELD

NP: Synchronize and null check on the same field.

如果程式碼塊是同步的,那麼久不可能為空。如果是空,同步時就會丟擲NullPointerException異常。最好是在另一個程式碼塊中進行同步。

Multithreaded correctness

NO_NOTIFY_NOT_NOTIFYALL

No: Using notify() rather than notifyAll()

呼叫notify()而不是notifyAll()方法。 Java的監控器通常用於多個條件。呼叫notify()只喚醒一個執行緒,這意味著該執行緒被喚醒只是滿足的當前的唯一條件。

Multithreaded correctness

RS_READOBJECT_SYNC

RS: Class's readObject() method is synchronized

序列化類中定義了同步的readObject()。透過定義,反序列化建立的物件只有一個執行緒可以訪問,因此沒有必要的readObject()進行同步。如果的readObject()方法本身造成物件對另一個執行緒可見,那麼這本身就是不好的編碼方式。

Multithreaded correctness

RU_INVOKE_RUN

Ru: Invokes run on a thread (did you mean to start it instead?)

這種方法顯式呼叫一個物件的run()。一般來說,類是實現Runnable介面的,因為在一個新的執行緒他們將有自己的run()方法,在這種情況下Thread.start()方法呼叫是正確的。

Multithreaded correctness

SC_START_IN_CTOR

SC: Constructor invokes Thread.start()

在建構函式中啟動一個執行緒。如果類曾經被子類擴充套件過,那麼這很可能是錯的,因為執行緒將在子類構造之前開始啟動。

Multithreaded correctness

SP_SPIN_ON_FIELD

SP: Method spins on field

方法無限迴圈讀取一個欄位。編譯器可合法懸掛宣讀迴圈,變成一個無限迴圈的程式碼。這個類應該改變,所以使用適當的同步(包括等待和通知要求)

Multithreaded correctness

STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE

STCAL: Call to static Calendar

即使JavaDoc對此不包含暗示,而Calendars本身在多執行緒中使用就是不安全的。探測器發現當呼叫Calendars的例項時將會獲得一個靜態物件。Calendar rightNow = Calendar.getInstance();

Multithreaded correctness

STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE

STCAL: Call to static DateFormat

在官方的JavaDoc,DateFormats多執行緒使用本事就是不安全的。探測器發現呼叫一個DateFormat的例項將會獲得一個靜態物件。
myString = DateFormat.getDateInstance().format(myDate);

Multithreaded correctness

STCAL_STATIC_CALENDAR_INSTANCE

STCAL: Static Calendar field

Calendar在多執行緒中本身就是不安全的,如果線上程範圍中共享一個Calendarde 例項而不使用一個同步的方法在應用中就會出現一些奇怪的行為。在sun.util.calendar.BaseCalendar.getCalendarDateFromFixedDate()中會丟擲ArrayIndexOutOfBoundsExceptions or IndexOutOfBoundsExceptions異常。

Multithreaded correctness

STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE

STCAL: Static DateFormat

DateFormat 在多執行緒中本身就是不安全的,如果線上程範圍中共享一個DateFormat的例項而不使用一個同步的方法在應用中就會出現一些奇怪的行為。

Multithreaded correctness

SWL_SLEEP_WITH_LOCK_HELD

SWL: Method calls Thread.sleep() with a lock held

當持有物件時呼叫Thread.sleep()。這可能會導致很差的效能和可擴充套件性,或陷入死鎖,因為其他執行緒可能正在等待獲得鎖。呼叫wait()是一個更好的主意,釋放物件的持有以允許其他執行緒執行。

Multithreaded correctness

UG_SYNC_SET_UNSYNC_GET

UG: Unsynchronized get method, synchronized set method

這個類包含類似命名的get和set方法。在set方法是同步方法和get方法是非同步方法。這可能會導致在執行時的不正確行為,因為呼叫的get方法不一定返回物件一致狀態。 GET方法應該同步。

Multithreaded correctness

UL_UNRELEASED_LOCK

UL: Method does not release lock on all paths

方法獲得了當前的物件所,但是在方法中始終沒有釋放它。一個正確的示例如下:
Lock l = ...;
l.lock();
try {
// do something
} finally {
l.unlock();
}

Multithreaded correctness

UL_UNRELEASED_LOCK_EXCEPTION_PATH

UL: Method does not release lock on all exception paths

方法獲得了當前的物件所,但是在所有的異常處理中始終沒有釋放它。一個正確的示例如下:
Lock l = ...;
l.lock();
try {
// do something
} finally {
l.unlock();
}

Multithreaded correctness

UW_UNCOND_WAIT

UW: Unconditional wait

方法中包含呼叫java.lang.Object.wait(),而卻沒有放到條件流程控制中。該程式碼應確認條件尚未滿足之前等待;先前任何通知將被忽略。

Multithreaded correctness

VO_VOLATILE_REFERENCE_TO_ARRAY

VO: A volatile reference to an array doesn't treat the array elements as volatile

宣告一個變數引用陣列,這可能不是你想要的。如果一個變數引用陣列,那麼對引用陣列的讀和寫都是不安全的,但是陣列元素不是變數。取得陣列的變數值你可以使用java.util.concurrent包中的陣列的原子性特性

Multithreaded correctness

WS_WRITEOBJECT_SYNC

WS: Class's writeObject() method is synchronized but nothing else is

這個類有一個writeObject()方法是同步的,但是這個類中沒有其他的同步方法。

Multithreaded correctness

WA_AWAIT_NOT_IN_LOOP

Wa: Condition.await() not in loop

方法沒有在迴圈中呼叫java.util.concurrent.await()。如果物件是用於多種條件,打算呼叫wait()方法的條件可能不是實際發生的。

Multithreaded correctness

WA_NOT_IN_LOOP

Wa: Wait not in loop

這種方法包含呼叫java.lang.Object.wait(),而這並不是一個迴圈。如果監視器用於多個條件,打算呼叫wait()方法的條件可能不是實際發生的。

Performance

BX_BOXING_IMMEDIATELY_UNBOXED

Bx: Primitive value is boxed and then immediately unboxed

對原始值進行裝箱,然後立即取消裝箱。這可能是在一個未要求裝箱的地方進行了手動裝箱,從而迫使編譯器進行立即撤消裝箱的操作

Performance

BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION

Bx: Primitive value is boxed then unboxed to perform primitive coercion

對原始值進行裝箱然後立即把它強制轉換為另外一種原始型別。例如:
new Double(d).intValue()應該直接進行強制轉換例如:(int) d

Performance

BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR

Bx: Primitive value is unboxed and coerced for ternary operator

在三元運算子操作時如果沒有對值進行封裝或者型別轉換。例如:b ? e1 : e2

Performance

DM_FP_NUMBER_CTOR

Bx: Method invokes inefficient floating-point Number constructor; use static valueOf instead

使用new Double(double)方法總是會建立一個新的物件,然而使用Double.valueOf(double)方法可以把值儲存在編輯器或者class library、JVM中。使用儲存值的方式來避免物件的分配可以或得更好的程式碼效能除非類必須符合Java 1.5以前的JVM,否則請使用自動裝箱或valueOf()方法建立Double和Float例項。

Performance

DM_NUMBER_CTOR

Bx: Method invokes inefficient Number constructor; use static valueOf instead

使用new Integer(int)方法總是會建立一個新的物件,然而使用Integer.valueOf(int)方法可以把值儲存在編輯器或者class library、JVM中。使用儲存值的方式來避免物件的分配可以或得更好的程式碼效能除非類必須符合Java 1.5以前的JVM,否則請使用自動裝箱或valueOf()方法建立Long, Integer, Short, Character, Byte例項。

Performance

DMI_BLOCKING_METHODS_ON_URL

Dm: The equals and hashCode methods of URL are blocking

使用equals和hashCode方法來對url進行資源識別符號解析時會引起堵塞。考慮使用java.net.URI來代替。

Performance

DMI_COLLECTION_OF_URLS

Dm: Maps and sets of URLs can be performance hogs

方法或者欄位使用url的map/set集合。因為equals方法或者hashCode方法來進行資源識別符號解析時都會引起堵塞。考慮使用java.net.URI來代替。

Performance

DM_BOOLEAN_CTOR

Dm: Method invokes inefficient Boolean constructor; use Boolean.valueOf(...) instead

使用new方法建立一個java.lang.Boolean型別能夠的例項物件是浪費空間的,因為Boolean物件是不可變的而且只有兩個有用的值。使用Boolean.valueOf()或者Java1.5中的自動裝箱功能來建立一個Boolean例項。

Performance

DM_GC

Dm: Explicit garbage collection; extremely dubious except in benchmarking code

在程式碼中顯式的呼叫垃圾回收命名,這樣做並不能起作用。在過去,有人在關閉操作或者finalize方法中呼叫垃圾回收方法導致了很多的效能浪費。這樣大規模回收物件時會造成處理器執行緩慢。

Performance

DM_NEXTINT_VIA_NEXTDOUBLE

Dm: Use the nextInt method of Random rather than nextDouble to generate a random integer

如果r是一個java.util.Random物件,你可以使r.nextInt(n)生成一個0到n-1之前的隨機數,而不是使用(int)(r.nextDouble() * n)

Performance

DM_STRING_CTOR

Dm: Method invokes inefficient new String(String) constructor

使用java.lang.String(String)建構函式會浪費記憶體因為這種構造方式和String作為引數在功能上容易混亂。只是使用String直接作為引數的形式

Performance

DM_STRING_TOSTRING

Dm: Method invokes toString() method on a String

呼叫String.toString()是多餘的操作,只要使用String就可以了。

Performance

DM_STRING_VOID_CTOR

Dm: Method invokes inefficient new String() constructor

使用沒有引數的構造方法去建立新的String物件是浪費記憶體空間的,因為這樣建立會和空字串“”混淆。Java中保證完成相同的構造方法會產生描繪相同的String物件。所以你只要使用空字串來建立就可以了。

Performance

ITA_INEFFICIENT_TO_ARRAY

ITA: Method uses toArray() with zero-length array argument

當使用集合的toArray()方法時使用陣列長度為0的陣列作為引數。比這更有效的一種方法是myCollection.toArray(new Foo[myCollection.size()]),如果陣列的長度足夠大就可以直接把集合中的內容包裝到陣列中直接返回從而避免了第二次建立一個新的陣列來存放集合中值。

Performance

SS_SHOULD_BE_STATIC

SS: Unread field: should this field be static?

類中所包含的final屬性欄位在編譯器中初始化為靜態的值。考慮在定義時就把它定義為static型別的。

Performance

UPM_UNCALLED_PRIVATE_METHOD

UPM: Private method is never called

定義為Private型別方法從未被呼叫,應該被刪除。

Performance

URF_UNREAD_FIELD

UrF: Unread field

類中定義的屬性從未被呼叫,建議刪除。

Performance

UUF_UNUSED_FIELD

UuF: Unused field

類中定義的屬性從未被使用,建議刪除。

Performance

WMI_WRONG_MAP_ITERATOR

WMI: Inefficient use of keySet iterator instead of entrySet iterator

當方法中接受一個Map型別的引數時,使用keySet的迭代器比使用entrySet的迭代器效率要高。

Security

DMI_CONSTANT_DB_PASSWORD

Dm: Hardcoded constant database password

程式碼中建立DB的密碼時採用了寫死的密碼。

Security

DMI_EMPTY_DB_PASSWORD

Dm: Empty database password

建立資料庫連線時沒有為資料庫設定密碼,這會使資料庫沒有必要的保護。

Security

HRS_REQUEST_PARAMETER_TO_COOKIE

HRS: HTTP cookie formed from untrusted input

此程式碼使用不受信任的HTTP引數構造一個HTTP Cookie。

Security

HRS_REQUEST_PARAMETER_TO_HTTP_HEADER

HRS: HTTP Response splitting vulnerability

在程式碼中直接把一個HTTP的引數寫入一個HTTP標頭檔案中,它為HTTP的響應暴露了漏洞。

Security

SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE

SQL: Nonconstant string passed to execute or addBatch method on an SQL statement

該方法以字串的形式來呼叫SQLstatement的execute方法,它似乎是動態生成SQL語句的方法。這會更容易受到SQL隱碼攻擊。

Security

XSS_REQUEST_PARAMETER_TO_JSP_WRITER

XSS: JSP reflected cross site scripting vulnerability

在程式碼中在JSP輸出中直接寫入一個HTTP引數,這會造成一個跨站點的指令碼漏洞。

Security

XSS_REQUEST_PARAMETER_TO_SEND_ERROR

XSS: Servlet reflected cross site scripting vulnerability in error page

在程式碼中在Servlet輸出中直接寫入一個HTTP引數,這會造成一個跨站點的指令碼漏洞。

Security

XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER

XSS: Servlet reflected cross site scripting vulnerability

程式碼直接寫入引數的HTTP伺服器錯誤頁(使用HttpServletResponse.sendError)。表達了類似的不受信任的輸入會引起跨站點指令碼漏洞。

Dodgy code

BC_BAD_CAST_TO_ABSTRACT_COLLECTION

BC: Questionable cast to abstract collection

在程式碼投把一個集合強制型別轉換為一個抽象的集合(如list,set或map)。保證該物件型別和將要轉換的型別是一致的。如果你只是想要便利一個集合,那麼你就不必將它轉換為Set或List。

Dodgy code

BC_BAD_CAST_TO_CONCRETE_COLLECTION

BC: Questionable cast to concrete collection

程式碼把抽象的集合(如List,Set,或Collection)強制轉換為具體落實型別(如一個ArrayList或HashSet)。這可能不正確,也可能使您的程式碼很脆弱,因為它使得難以在今後的切換指向其他具體實現。除非你有特別理由這樣做,否則只需要使用抽象的集合類。

Dodgy code

BC_UNCONFIRMED_CAST

BC: Unchecked/unconfirmed cast

強制型別轉換操作沒有經過驗證,而且不是所有的此種型別裝換過的類都可以再強制型別轉換為原型別。在程式碼中需要進行邏輯判斷以保證可以進行這樣的操作。

Dodgy code

BC_VACUOUS_INSTANCEOF

BC: instanceof will always return true

instanceof測試將始終返回真(除非被測試的值為空)。雖然這是安全,確保它是不是說明一些誤解或其他一些邏輯錯誤。如果你真的想測試是空的價值,也許會更清楚這樣做的更好空試驗,而不是一個instanceof測試。

Dodgy code

ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT

BSHIFT: Unsigned right shift cast to short/byte

無符號數右移後進行轉換為short或者byte型別時可能會丟棄掉高位的值,這樣的結果就是有符合數和無符號數無法區分(這取決於移位大小)

Dodgy code

CI_CONFUSED_INHERITANCE

CI: Class is final but declares protected field

這個類被宣告為final的,而是欄位屬性卻宣告為保護型別的。由於是final類,它不能再被繼承,而再宣告為保護型別的很容易造成混淆。為了從外部能正確的使用它應該把它們宣告為private或者public型別。

Dodgy code

DB_DUPLICATE_BRANCHES

DB: Method uses the same code for two branches

此方法使用相同的程式碼,以實現兩個有條件的分支。檢查以確保這是不是一個編碼錯誤。

Dodgy code

DB_DUPLICATE_SWITCH_CLAUSES

DB: Method uses the same code for two switch clauses

他的方法使用相同的程式碼來實現兩個switch的宣告條款。這可能是重複程式碼的情況,但可能也顯示出編碼的錯誤。

Dodgy code

DLS_DEAD_LOCAL_STORE

DLS: Dead store to local variable

該指令為區域性變數賦值,但在其後的沒有對她做任何使用。通常,這表明一個錯誤,因為值從未使用過。

Dodgy code

DLS_DEAD_LOCAL_STORE_IN_RETURN

DLS: Useless assignment in return statement

本宣告把一個區域性變數放到方法的返回語句中。這對於方法中區域性變數來說是沒有意思的。

Dodgy code

DLS_DEAD_LOCAL_STORE_OF_NULL

DLS: Dead store of null to local variable

把一個本地變數賦值為null值,並且再也沒有對這個變數做任何的操作。這樣可能是為了垃圾回收,而是Java SE 6.0,這已不再需要。

Dodgy code

DMI_HARDCODED_ABSOLUTE_FILENAME

DMI: Code contains a hard coded reference to an absolute pathname

此程式碼包含檔案物件為一個絕對路徑名

Dodgy code

DMI_NONSERIALIZABLE_OBJECT_WRITTEN

DMI: Non serializable object written to ObjectOutput

程式碼中讓一個非序列化的物件出現在ObjectOutput.writeObject()方法中,這樣會引起一個錯誤。

Dodgy code

DMI_USELESS_SUBSTRING

DMI: Invocation of substring(0), which returns the original value

此程式碼呼叫了subString(0)方法,它將返回原來的值。

Dodgy code

EQ_DOESNT_OVERRIDE_EQUALS

Eq: Class doesn't override equals in superclass

子類定義了一個新的equals方法但是卻不是覆寫了父類本省的equals()方法。

Dodgy code

FE_FLOATING_POINT_EQUALITY

FE: Test for floating point equality

此操作比較兩個浮點值是否相等。由於浮點運算可能會涉及到舍入,計算float和double值可能不準確。如果要求值必須準確,如貨幣值,可以考慮使用固定精度型別,如BigDecimal型別的值來比較

Dodgy code

VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN

FS: Non-Boolean argument formatted using %b format specifier

使用%b去格式化Boolean型別的值不正確的但是它不會丟擲異常,任何非空的值都會輸出true,任何為空的值都會輸出false

Dodgy code

IC_INIT_CIRCULARITY

IC: Initialization circularity

在引用兩個相互呼叫為環狀static方法去初始化一個例項時是錯誤的。

Dodgy code

ICAST_IDIV_CAST_TO_DOUBLE

ICAST: Integral division result cast to double or float

整形數除法強制轉換為double或者float型別。
int x = 2;
int y = 5;
// Wrong: yields result 0.0
double value1 = x / y;
// Right: yields result 0.4
double value2 = x / (double) y;

Dodgy code

IM_AVERAGE_COMPUTATION_COULD_OVERFLOW

IM: Computation of average could overflow

程式碼中使用x % 2 == 1的方法去驗證運算是否存在餘數的情況,但是如果出現負數的情況就不起作用了。使用x & 1 == 1, or x % 2 != 0來代替

Dodgy code

INT_VACUOUS_COMPARISON

INT: Vacuous comparison of integer value

整形數進行比較結果總是不變。例如:x <= Integer.MAX_VALUE

Dodgy code

MTIA_SUSPECT_SERVLET_INSTANCE_FIELD

MTIA: Class extends Servlet class and uses instance variables

這個類擴充套件從Servlet類,並使用例項的成員變數。由於只有一個Servlet類的例項,並在多執行緒方式使用,這種模式有可能存在問題。考慮只使用方法的區域性變數。

Dodgy code

MTIA_SUSPECT_STRUTS_INSTANCE_FIELD

MTIA: Class extends Struts Action class and uses instance variables

類擴充套件自Struts的Action類並使用這個例項的成員變數,因為在Struts框架中只存在一個Action例項物件並且使用在多執行緒的情況下很可能會出現問題。

Dodgy code

NP_DEREFERENCE_OF_READLINE_VALUE

NP: Dereference of the result of readLine() without nullcheck

readLine()的結果值沒有進行判空操作就去重新賦值,這樣的操作可以會丟擲空指標異常。

Dodgy code

NP_IMMEDIATE_DEREFERENCE_OF_READLINE

NP: Immediate dereference of the result of readLine()

readLine()的結果立即賦值,這樣的操作可以會丟擲空指標異常。

Dodgy code

NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE

NP: Possible null pointer dereference due to return value of called method

方法的返回值沒有進行是否為空的檢查就重新賦值,這樣可能會出現空指標異常。

Dodgy code

NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE

NP: Parameter must be non-null but is marked as nullable

引數值在任何情況下都不能為空,但是有明確的註釋它可以為空。

Dodgy code

NS_DANGEROUS_NON_SHORT_CIRCUIT

NS: Potentially dangerous use of non-short-circuit logic

程式碼中使用(& or |)代替(&& or ||)操作,這會造成潛在的危險。

Dodgy code

NS_NON_SHORT_CIRCUIT

NS: Questionable use of non-short-circuit logic

程式碼中使用(& or |)代替(&& or ||)操作,會引起不安全的操作

Dodgy code

PZLA_PREFER_ZERO_LENGTH_ARRAYS

PZLA: Consider returning a zero length array rather than null

考慮返回一個零長度的陣列,而不是null值

Dodgy code

QF_QUESTIONABLE_FOR_LOOP

QF: Complicated, subtle or wrong increment in for-loop

確定這個迴圈是正確的變數遞增,看起來,另一個變數被初始化,檢查的迴圈。這是由於for迴圈中太複雜的定義造成的。

Dodgy code

RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE

RCN: Redundant comparison of non-null value to null

方法中包含一個不能為空的賦值還包含一個可以為空的賦值。冗餘比較非空值為空。

Dodgy code

RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES

RCN: Redundant comparison of two null values

方法中對兩個null值進行比較

Dodgy code

RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE

RCN: Redundant nullcheck of value known to be non-null

方法中對不為空的值進行為空的判斷。

Dodgy code

REC_CATCH_EXCEPTION

REC: Exception is caught when Exception is not thrown

try/catch塊中捕獲異常,但是異常沒有在try語句中丟擲而RuntimeException又沒有明確的被捕獲

Dodgy code

RI_REDUNDANT_INTERFACES

RI: Class implements same interface as superclass

子類和父類都實現了同一個介面,這種定義是多餘的。

Dodgy code

RV_DONT_JUST_NULL_CHECK_READLINE

RV: Method discards result of readLine after checking if it is non-null

readLine方法的結果不為空時被拋棄

Dodgy code

RV_REM_OF_RANDOM_INT

RV: Remainder of 32-bit signed random integer

此程式碼生成一個隨機的符號整數,然後計算另一個值的。由於隨機數可以是負數,所以其餘操作的結果也可以是負面的。考慮使用Random.nextInt(int)方法代替。

Dodgy code

SA_FIELD_DOUBLE_ASSIGNMENT

SA: Double assignment of field

方法中的欄位包含了雙重任務,例如:
int x;
public void foo() {
x = x = 17;
}
這種為變數賦值是無用的,並可能表明一個邏輯錯誤或拼寫錯誤。

Dodgy code

SA_LOCAL_DOUBLE_ASSIGNMENT

SA: Double assignment of local variable

為一個區域性變數兩次賦值,這樣是沒有意義的。例如:
public void foo() {
int x,y;
x = x = 17;
}

Dodgy code

SA_LOCAL_SELF_ASSIGNMENT

SA: Self assignment of local variable

區域性變數使用自身給自己賦值
public void foo() {
int x = 3;
x = x;
}

Dodgy code

SF_SWITCH_FALLTHROUGH

SF: Switch statement found where one case falls through to the next case

Switch語句中一個分支執行後又執行了下一個分支。通常case後面要跟break 或者return語句來跳出。

Dodgy code

SF_SWITCH_NO_DEFAULT

SF: Switch statement found where default case is missing

Switch沒有預設情況下執行的case語句。

Dodgy code

SE_PRIVATE_READ_RESOLVE_NOT_INHERITED

Se: Private readResolve method not inherited by subclasses

宣告為private的序列化方法被子類繼承

Dodgy code

UCF_USELESS_CONTROL_FLOW

UCF: Useless control flow

沒有任何作用的條件語句。
if (argv.length == 0) {
// TODO: handle this case
}

Dodgy code

UCF_USELESS_CONTROL_FLOW_NEXT_LINE

UCF: Useless control flow to next line

無效的條件控制語句,注意if (argv.length == 1);以“;”結尾,下面的語句無論是否滿足都會執行。
if (argv.length == 1);
System.out.println("Hello, " + argv[0]);

Dodgy code

XFB_XML_FACTORY_BYPASS

XFB: Method directly allocates a specific implementation of xml interfaces

方法自定義了一種XML介面的實現類。最好是使用官方提供的工廠類來建立這些物件,以便可以在執行期中改變。例如:
javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.SAXParserFactory
javax.xml.transform.TransformerFactory
org.w3c.dom.Document.createXXXX

相關文章