1. FindBugs是什麼
FindBugs 是一個靜態分析工具,它檢查類或者 JAR 檔案,將位元組碼與一組缺陷模式進行對比以發現可能的問題。有了靜態分析工具,就可以在不實際執行程式的情況對軟體進行分析。
FindBugs就是對編譯後的class進行掃描,以發現一些隱藏的bug。如果你擁有這些.class檔對應的程式碼檔案,可把這些原始碼檔案再選上,這樣便可以從稍後得出的報告中快捷的定位到出問題的程式碼上面。此外,還可以選上工程所使用的library,這樣似乎可以幫助FindBugs做一些高階的檢查,以發現一些更深層的bug。
2. FindBugs的作用
使用FindBugs一般建議是在開發階段,在這個階段將 FindBugs 加入到編譯過程中,可以儘可能早地在進行編譯時發現問題,從而保證保證專案研發質量。尤其當團隊擴大,並且不可避免地在專案中加入更多新開發人員時,FindBugs 可以作為一個安全網,檢測出已經識別的缺陷模式。如果讓一定數量的開發人員共同工作,那麼在程式碼中就會出現缺陷。像 FindBugs 這樣的工具當然不會找出所有的缺陷,但是它們會幫助找出其中的部分。
一旦確定了加入哪些過濾器和類,執行 FindBugs 就沒什麼成本了,而帶來的好處就是它會檢測出新缺陷。如果編寫特定於應用程式的檢測器,則這個好處可能更大。
3. FindBugs的使用
FindBugs的使用一般分為獨立使用和整合使用,獨立使用是指單獨安裝FindBugs程式,然後在命令列或其他流程中全套使用,如DevOps平臺。嵌入使用一般是與開發工具或整合工具使用,如eclipse、idea、Jenkins等。
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條目為空。 |
AM_CREATES_EMPTY_ZIP_FILE_ENTRY |
AM: Creates an empty zip file entry |
呼叫putNextEntry()方法寫入新的 zip 檔案條目時立即呼叫closeEntry()方法。這樣會造成ZipFile條目為空。 |
|
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。 |
|
BIT_SIGNED_CHECK |
BIT: Check for sign of bitwise operation |
檢查位運算子執行是否合理 |
|
CN_IDIOM |
CN: Class implements Cloneable but does not define or use clone method |
按照慣例,實現此介面的類應該使用公共方法重寫 Object.clone(它是受保護的),以獲得有關重寫此方法的詳細資訊。此介面不 包含 clone 方法。因此,因為某個物件實現了此介面就克隆它是不可能的,應該實現此介面的類應該使用公共方法重寫 Object.clone |
|
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()方法。 |
|
CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE |
CN: Class defines clone() but doesn't implement Cloneable |
類中定義了clone方法但是它沒有實現Cloneable介面 |
|
CNT_ROUGH_CONSTANT_VALUE |
CNT: Rough value of known constant found |
建議使用預定義的庫常量以提高程式碼的清晰度和精度。 |
|
CO_ABSTRACT_SELF |
Co: Abstract class defines covariant compareTo() method |
抽象類中定義了多個compareTo()方法,正確的是覆寫Comparable中的compareTo方法,方法的引數為Object型別,如下例: |
|
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靜態方法,這些方法可以正確處理所有特殊情況。 |
|
CO_COMPARETO_RESULTS_MIN_VALUE |
Co: compareTo()/compare() returns Integer.MIN_VALUE |
在某些情況下,此compareTo或compare方法返回常量Integer。MIN_VALUE,這是一種異常糟糕的做法。compareTo的返回值唯一重要的是結果的符號。但人們有時會否定compareTo的返回值,以為這會否定結果的符號。它會的,除非返回的值是Integer。最小值。所以只需返回-1而不是Integer。最小值。 |
|
CO_SELF_NO_OBJECT |
Co: Covariant compareTo() method defined |
類中定義了多個compareTo()方法,正確的是覆寫Comparable中的compareTo方法,方法的引數為Object型別 |
|
DE_MIGHT_DROP |
DE: Method might drop exception |
方法可能丟擲異常 |
|
DE_MIGHT_IGNORE |
DE: Method might ignore exception |
方法可能忽略異常 |
|
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方法,那麼事情就會嚴重出錯。 |
|
DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION |
DMI: Don't use removeAll to clear a collection |
不要用removeAll方法去clear一個集合 |
|
DM_EXIT |
Dm: Method invokes System.exit(...) |
在方法中呼叫System.exit(...)語句,考慮用RuntimeException來代替 |
|
DM_RUN_FINALIZERS_ON_EXIT |
Dm: Method invokes dangerous method runFinalizersOnExit |
在方法中呼叫了System.runFinalizersOnExit 或者Runtime.runFinalizersOnExit方法,因為這樣做是很危險的。 |
|
ES_COMPARING_PARAMETER_STRING_WITH_EQ |
ES: Comparison of String parameter using == or != |
用==或者!=方法去比較String型別的引數 |
|
ES_COMPARING_STRINGS_WITH_EQ |
ES: Comparison of String objects using == or != |
用==或者!=去比較String型別的物件 |
|
EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS |
Eq: Equals checks for incompatible operand |
equals方法檢查不一致的操作。兩個類根本就是父子關係而去呼叫equals方法去判讀物件是否相等。 |
|
EQ_COMPARETO_USE_OBJECT_EQUALS |
Eq: Class defines compareTo(...) and uses Object.equals() |
類中定義了compareTo方法但是繼承了Object中的compareTo方法 |
|
EQ_GETCLASS_AND_CLASS_CONSTANT |
Eq: equals method fails for subtypes |
類中的equals方法可能被子類中的方法所破壞,當使用類似於Foo.class == o.getClass()的判斷時考慮用this.getClass() == o.getClass()來替換 |
|
EQ_SELF_NO_OBJECT |
Eq: Covariant equals() method defined |
類中定義了多個equals方法。正確的做法是覆寫Object中的equals方法,它的引數為Object型別的物件。 |
|
FI_EMPTY |
FI: Empty finalizer should be deleted |
為空的finalizer方法應該刪除。一下關於finalizer的內容省略 |
|
HE_EQUALS_NO_HASHCODE |
HE: Class defines equals() but not hashCode() |
方法定義了equals方法卻沒有定義hashCode方法 |
|
HE_HASHCODE_NO_EQUALS |
HE: Class defines hashCode() but not equals() |
類定義了hashCode方法去沒有定義equal方法 |
|
HE_EQUALS_USE_HASHCODE |
HE: Class defines hashCode() and uses Object.equals() |
一個類覆寫了equals方法,沒有覆寫hashCode方法,使用了Object物件的hashCode方法 |
|
HE_INHERITS_EQUALS_USE_HASHCODE |
HE: Class inherits equals() and uses Object.hashCode() |
子類繼承了父類的equals方法卻使用了Object的hashCode方法 |
|
IMSE_DONT_CATCH_IMSE |
IMSE: Dubious catching of IllegalMonitorStateException |
捕捉違法的監控狀態異常,例如當沒有獲取到物件鎖時使用其wait和notify方法 |
|
ISC_INSTANTIATE_STATIC_CLASS |
ISC: Needless instantiation of class that only supplies static methods |
為使用靜態方法而建立一個例項物件。呼叫靜態方法時只需要使用類名+靜態方法名就可以了。 |
|
IT_NO_SUCH_ELEMENT |
It: Iterator next() method can't throw NoSuchElementException |
迭代器的next方法不能夠丟擲NoSuchElementException |
|
J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION |
J2EE: Store of non serializable object into HttpSession |
在HttpSession物件中儲存非連續的物件 |
|
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. . |
|
NP_BOOLEAN_RETURN_NULL |
NP: Method with Boolean return type returns explicit null |
返回值為boolean型別的方法直接返回null,這樣會導致空指標異常 |
|
NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT |
NP: equals() method does not check for null argument |
變數呼叫equals方法時沒有進行是否為null的判斷 |
|
NP_TOSTRING_COULD_RETURN_NULL |
NP: toString method may return null |
toString方法可能返回null |
|
NM_CLASS_NAMING_CONVENTION |
Nm: Class names should start with an upper case letter |
類的名稱以大寫字母名稱開頭 |
|
NM_CLASS_NOT_EXCEPTION |
Nm: Class is not derived from an Exception, even though it is named as such |
類的名稱中含有Exception但是卻不是一個異常類的子類,這種名稱會造成混淆 |
|
NM_CONFUSING |
Nm: Confusing method names |
令人迷惑的方面命名 |
|
NM_FIELD_NAMING_CONVENTION |
Nm: Field names should start with a lower case letter |
非final型別的欄位需要遵循駝峰命名原則 |
|
NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER |
Nm: Use of identifier that is a keyword in later versions of Java |
驗證是否是java預留關鍵字 |
|
NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER |
Nm: Use of identifier that is a keyword in later versions of Java |
驗證是否是java預留關鍵字 |
|
NM_METHOD_NAMING_CONVENTION |
Nm: Method names should start with a lower case letter |
方法名稱以小寫字母開頭 |
|
NM_SAME_SIMPLE_NAME_AS_INTERFACE |
Nm: Class names shouldn't shadow simple name of implemented interface |
實現同一介面實現類不能使用相同的名稱,即使它們位於不同的包中 |
|
NM_SAME_SIMPLE_NAME_AS_SUPERCLASS |
Nm: Class names shouldn't shadow simple name of superclass |
繼承同一父類的子類不能使用相同的名稱,即使它們位於不同的包中 |
|
NM_VERY_CONFUSING_INTENTIONAL |
Nm: Very confusing method names (but perhaps intentional) |
很容易混淆的方法命名,例如方法的名稱名稱使用使用大小寫來區別兩個不同的方法。 |
|
NM_WRONG_PACKAGE_INTENTIONAL |
Nm: Method doesn't override method in superclass due to wrong package for parameter |
由於錯誤引用了不同包中相同類名的物件而不能夠正確的覆寫父類中的方法 |
|
OBL_UNSATISFIED_OBLIGATION |
ODR: Method may fail to close database resource |
這種方法可能無法清除(關閉,處置)一個流,資料庫物件,或其他資源需要一個明確的清理行動。 |
|
ODR_OPEN_DATABASE_RESOURCE |
ODR: Method may fail to close database resource on exception |
方法中可能存在關閉資料連線失敗的情況 |
|
OS_OPEN_STREAM |
OS: Method may fail to close stream |
方法中可能存在關閉流失敗的情況 |
|
OS_OPEN_STREAM_EXCEPTION_PATH |
OS: Method may fail to close stream on exception |
方法中可能存在關閉流時出現異常情況 |
|
RC_REF_COMPARISON_BAD_PRACTICE |
RC: Suspicious reference comparison to constant |
當兩者為不同型別的物件時使用equals方法來比較它們的值是否相等,而不是使用==方法。例如比較的兩者為java.lang.Integer, java.lang.Float |
|
RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN |
RC: Suspicious reference comparison of Boolean values |
使用== 或者 !=運算子來比較兩個 Boolean型別的物件,建議使用equals方法。 |
|
RR_NOT_CHECKED |
RR: Method ignores results of InputStream.read() |
InputStream.read方法忽略返回的多個字元,如果對結果沒有檢查就沒法正確處理使用者讀取少量字元請求的情況。 |
|
SR_NOT_CHECKED |
RR: Method ignores results of InputStream.skip() |
InputStream.skip()方法忽略返回的多個字元,如果對結果沒有檢查就沒法正確處理使用者跳過少量字元請求的情況 |
|
RV_RETURN_VALUE_IGNORED_BAD_PRACTICE |
RV: Method ignores exceptional return value |
方法忽略返回值的異常資訊 |
|
SI_INSTANCE_BEFORE_FINALS_ASSIGNED |
SI: Static initializer creates instance before all static final fields assigned |
在所有的static final欄位賦值之前去使用靜態初始化的方法建立一個類的例項。 |
|
SE_BAD_FIELD_STORE |
Se: Non-serializable value stored into instance field of a serializable class |
非序列化的值儲存在宣告為序列化的的非序列化欄位中 |
|
SE_COMPARATOR_SHOULD_BE_SERIALIZABLE |
Se: Comparator doesn't implement Serializable |
Comparator介面沒有實現Serializable介面 |
|
SE_INNER_CLASS |
Se: Serializable inner class |
序列化內部類 |
|
SE_NONFINAL_SERIALVERSIONID |
Se: serialVersionUID isn't final |
關於UID類的檢查內容省略 |
|
SE_NO_SUITABLE_CONSTRUCTOR |
Se: Class is Serializable but its superclass doesn't define a void constructor |
子類序列化時父類沒有提供一個void的建構函式 |
|
SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION |
Se: Class is Externalizable but doesn't define a void constructor |
Externalizable 例項類沒有定義一個void型別的建構函式 |
|
SE_READ_RESOLVE_MUST_RETURN_OBJECT |
Se: The readResolve method must be declared with a return type of Object. |
readResolve從流中讀取類的一個例項,此方法必須宣告返回一個Object型別的物件 |
|
UI_INHERITANCE_UNSAFE_GETRESOURCE |
UI: Usage of GetResource may be unsafe if class is extended |
當一個類被子類繼承後不要使用this.getClass().getResource(...)來獲取資源 |
|
BC_IMPOSSIBLE_CAST |
BC: Impossible cast |
不可能的類轉換,執行時會丟擲ClassCastException |
|
BC_IMPOSSIBLE_DOWNCAST |
BC: Impossible downcast |
父類在向下進行型別轉換時丟擲ClassCastException |
|
BC_IMPOSSIBLE_INSTANCEOF |
BC: instanceof will always return false |
採用instaneof方法進行比較時總是返回false。前提是保證它不是由於某些邏輯錯誤造成的。 |
|
BIT_AND |
BIT: Incompatible bit masks |
錯誤的使用&位運算子,例如(e & C) |
|
BIT_AND_ZZ |
BIT: Check to see if ((...) & 0) == 0 |
檢查恆等的邏輯錯誤 |
|
BIT_IOR |
BIT: Incompatible bit masks |
錯誤的使用|位運算子,例如(e | C) |
|
BIT_SIGNED_CHECK_HIGH_BIT |
BIT: Check for sign of bitwise operation |
檢查邏輯運算子操作返回的標識。例如((event.detail & SWT.SELECTED) > 0),建議採用!=0代替>0 |
|
BOA_BADLY_OVERRIDDEN_ADAPTER |
BOA: Class overrides a method implemented in super class Adapter wrongly |
子類錯誤的覆寫父類中用於適配監聽其他事件的方法,從而導致當觸發條件發生時不能被監聽者呼叫 |
|
DLS_DEAD_STORE_OF_CLASS_LITERAL |
DLS: Dead store of class literal |
以類的字面名稱方式為一個欄位賦值後再也沒有去使用它,在1.4jdk中它會自動呼叫靜態的初始化方法,而在jdk1.5中卻不會去執行。 |
|
DLS_OVERWRITTEN_INCREMENT |
DLS: Overwritten increment |
覆寫增量增加錯誤i = i++ |
|
DMI_BAD_MONTH |
DMI: Bad constant value for month |
月份的錯誤常量值 |
|
DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES |
DMI: Collections should not contain themselves |
集合沒有包含他們自己本身。 |
|
DMI_INVOKING_HASHCODE_ON_ARRAY |
DMI: Invocation of hashCode on an array |
陣列直接使用hashCode方法來返回雜湊碼。 |
|
DMI_VACUOUS_SELF_COLLECTION_CALL |
DMI: Vacuous call to collections |
集合的呼叫不能被感知。例如c.containsAll(c)總是返回true,而c.retainAll(c)的返回值不能被感知。 |
|
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). . |
|
EC_ARRAY_AND_NONARRAY |
EC: equals() used to compare array and nonarray |
陣列物件使用equals方法和非陣列物件進行比較。即使比較的雙方都是陣列物件也不應該使用equals方法,而應該比較它們的內容是否相等使用java.util.Arrays.equals(Object[], Object[]); |
|
EC_INCOMPATIBLE_ARRAY_COMPARE |
EC: equals(...) used to compare incompatible arrays |
使用equls方法去比較型別不相同的陣列。例如:String[] and StringBuffer[], or String[] and int[] |
|
EC_UNRELATED_CLASS_AND_INTERFACE |
EC: Call to equals() comparing unrelated class and interface |
使用equals方法比較不相關的類和介面 |
|
EC_UNRELATED_INTERFACES |
EC: Call to equals() comparing different interface types |
呼叫equals方法比較不同型別的介面 |
|
EC_UNRELATED_TYPES |
EC: Call to equals() comparing different types |
呼叫equals方法比較不同型別的類 |
|
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. |
|
EQ_ALWAYS_FALSE |
Eq: equals method always returns false |
使用equals方法返回值總是false |
|
EQ_ALWAYS_TRUE |
Eq: equals method always returns true |
equals方法返回值總是true |
|
EQ_COMPARING_CLASS_NAMES |
Eq: equals method compares class names rather than class objects |
使用equals方法去比較一個類的例項和類的型別 |
|
EQ_OTHER_NO_OBJECT |
Eq: equals() method defined that doesn't override equals(Object) |
類中定義的equals方法時不要覆寫equals(Object)方法 |
|
EQ_OTHER_USE_OBJECT |
Eq: equals() method defined that doesn't override Object.equals(Object) |
類中定義的equals方法時不要覆寫Object中的equals(Object)方法 |
|
EQ_SELF_USE_OBJECT |
Eq: Covariant equals() method defined, Object.equals(Object) inherited |
類中定義了一組equals方法,但是都是繼承的java.lang.Object class中的equals(Object)方法 |
|
VA_FORMAT_STRING_BAD_ARGUMENT |
FS: Format string placeholder incompatible with passed argument |
錯誤使用引數型別來格式化字串 |
|
VA_FORMAT_STRING_BAD_CONVERSION |
FS: The type of a supplied argument doesn't match format specifier |
指定的格式字串和引數型別不匹配,例如:String.format("%d", "1") |
|
VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_SUPPLIED |
FS: MessageFormat supplied where printf style format expected |
但用String的format方法時實際呼叫了MessageFormat中乾的格式化方法而引起格式化結果出錯。 |
|
VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED |
FS: More arguments are passed than are actually used in the format string |
使用String的format方法時有非法的引數也經過了格式化操作。 |
|
VA_FORMAT_STRING_ILLEGAL |
FS: Illegal format string |
格式化String物件語句錯誤 |
|
VA_FORMAT_STRING_MISSING_ARGUMENT |
FS: Format string references missing argument |
String的format操作缺少必要的引數。 |
|
VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT |
FS: No previous argument for format string |
格式字串定義錯誤,例如:formatter.format("%<s %s", "a", "b"); 丟擲MissingFormatArgumentException異常 |
|
ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL |
ICAST: Integral value cast to double and then passed to Math.ceil |
integral的值轉換為double後使用了Math.ceil方法 |
|
ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND |
ICAST: int value cast to float and then passed to Math.round |
int 型別的值轉換為float型別之後呼叫了Math.round方法 |
|
IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD |
IJU: JUnit assertion in run method will not be noticed by JUnit |
在JUnit中的斷言在run方法中不會被告知 |
|
IJU_BAD_SUITE_METHOD |
IJU: TestCase declares a bad suite method |
在一個JUnit類中宣告的一個suite()方法必須宣告為 |
|
IL_CONTAINER_ADDED_TO_ITSELF |
IL: A collection is added to itself |
集合本身作為add方法的引數,這樣會引起內容溢位。 |
|
IL_INFINITE_LOOP |
IL: An apparent infinite loop |
方法的自呼叫引起的死迴圈 |
|
IM_MULTIPLYING_RESULT_OF_IREM |
IM: Integer multiply of result of integer remainder |
和整數餘數進行乘法運算。例如:i % 60 * 1000 是進行(i % 60) * 1000運算而不是 i % (60 * 1000) |
|
INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE |
INT: Bad comparison of nonnegative value with negative constant or zero |
保證非負數和負數進行比較 |
|
INT_BAD_COMPARISON_WITH_SIGNED_BYTE |
INT: Bad comparison of signed byte |
比較有符合數,要先把有符號數轉換為無符合數再進行比較 |
|
IO_APPENDING_TO_OBJECT_OUTPUT_STREAM |
IO: Doomed attempt to append to an object output stream |
宣佈試圖在物件的輸出流處新增元素,如果你希望能夠新增進一個物件的輸出流中必須保證物件的輸出流處於開啟狀態。 |
|
IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN |
IP: A parameter is dead upon entry to a method but overwritten |
傳入引數的值被忽略,但是對傳入值進行了修改,並返回給了呼叫者 |
|
MF_CLASS_MASKS_FIELD |
MF: Class defines field that masks a superclass field |
子類中定義了和父類中同名的欄位。在呼叫時會出錯 |
|
MF_METHOD_MASKS_FIELD |
MF: Method defines a variable that obscures a field |
在方法中定義的區域性變數和類變數或者父類變數同名,從而引起欄位混淆。 |
|
NP_ALWAYS_NULL |
NP: Null pointer dereference |
物件賦為null值後 沒有被重新賦值 |
|
NP_ALWAYS_NULL_EXCEPTION |
NP: Null pointer dereference in method on exception path |
空指標引用上呼叫去除引用方法,將發生空指標異常 |
|
NP_ARGUMENT_MIGHT_BE_NULL |
NP: Method does not check for null argument |
方法沒有判斷引數是否為空 |
|
NP_CLOSING_NULL |
NP: close() invoked on a value that is always null |
一個為空的物件呼叫close方法 |
|
NP_GUARANTEED_DEREF |
NP: Null value is guaranteed to be dereferenced |
在正常的null判斷分支上,物件去除引用操作是受保護的不允許的 |
|
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). |
|
NP_NONNULL_PARAM_VIOLATION |
NP: Method call passes null to a non-null parameter |
方法中為null的引數沒有被重新賦值 |
|
NP_NONNULL_RETURN_VIOLATION |
NP: Method may return null, but is declared @Nonnull |
方法宣告瞭返回值不能為空,但是方法中有可能返回null |
|
NP_NULL_INSTANCEOF |
NP: A known null value is checked to see if it is an instance of a type |
檢查一個為null的值是否是想要的型別物件,而不是由於粗心或者邏輯錯誤引起的 |
|
NP_NULL_ON_SOME_PATH |
NP: Possible null pointer dereference |
物件可能沒有重新賦值 |
|
NP_NULL_ON_SOME_PATH_EXCEPTION |
NP: Possible null pointer dereference in method on exception path |
在異常null值處理分支呼叫的方法上,可能存在物件去除引用操作 |
|
NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS |
NP: Method call passes null for non-null parameter |
方法引數中宣告為nonnull型別的引數為null |
|
NP_STORE_INTO_NONNULL_FIELD |
NP: Store of null value into field annotated @Nonnull |
為一個已經宣告為不能為null值的屬性賦值為null。 |
|
NM_BAD_EQUAL |
Nm: Class defines equal(Object); should it be equals(Object)? |
類中定義了一個equal方法但是卻不是覆寫的Object物件的equals方法 |
|
NM_LCASE_HASHCODE |
Nm: Class defines hashcode(); should it be hashCode()? |
類中定義了一個hashCode方法但是卻不是覆寫的Object中的hashCode方法 |
|
NM_LCASE_TOSTRING |
Nm: Class defines tostring(); should it be toString()? |
類中定義了一個toString方法但是卻不是覆寫的Object中的toString方法 |
|
NM_METHOD_CONSTRUCTOR_CONFUSION |
Nm: Apparent method/constructor confusion |
構造方法定義混亂,保證一個標準的建構函式。 例如: |
|
NM_VERY_CONFUSING |
Nm: Very confusing method names |
混亂的方法命名,如getName和getname方法同時出現的時候 |
|
NM_WRONG_PACKAGE |
Nm: Method doesn't override method in superclass due to wrong package for parameter |
方法因為取了不同包中的同名的物件而沒有正確覆寫父類中的同名方法 |
|
QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT |
QBA: Method assigns boolean literal in boolean expression |
再if或者while表示式中使用boolean型別的值時應該使用==去判斷,而不是採用=操作 |
|
RC_REF_COMPARISON |
RC: Suspicious reference comparison |
比較兩個物件值是否相等時應該採用equals方法,而不是==方法 |
|
RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION |
RE: Invalid syntax for regular expression |
對正規表示式使用了錯誤的語法,會丟擲未經檢查的異常,表明正規表示式模式中的語法錯誤。 |
|
RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION |
RE: File.separator used for regular expression |
使用正規表示式使用了錯誤的檔案分隔符,在windows系統中正規表示式不會匹配’\’而應該使用'\\' |
|
RV_01_TO_INT |
RV: Random value from 0 to 1 is coerced to the integer 0 |
從0到1隨機值被強制為整數值0。在強制得到一個整數之前,你可能想得到多個隨機值。或使用Random.nextInt(n)的方法。 |
|
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的)。 |
|
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的)。 |
|
RV_EXCEPTION_NOT_THROWN |
RV: Exception created and dropped rather than thrown |
此程式碼建立一個異常(或錯誤)的物件,但不會用它做任何事情。例如:if (x < 0) |
|
RpC_REPEATED_CONDITIONAL_TEST |
RpC: Repeated conditional tests |
該程式碼包含對同一個條件試驗了兩次,兩邊完全一樣例如:(如X == 0 | | x == 0)。可能第二次出現是打算判斷別的不同條件(如X == 0 | | y== 0)。 |
|
SA_FIELD_SELF_ASSIGNMENT |
SA: Self assignment of field |
方法中包含自己對自己賦值的欄位。例如: |
|
SA_FIELD_SELF_COMPARISON |
SA: Self comparison of field with itself |
欄位自己進行自比較可能表明錯誤或邏輯錯誤。 |
|
SA_LOCAL_SELF_COMPUTATION |
SA: Nonsensical self computation involving a field (e.g., x & x) |
此方法對同一變數執行了荒謬的計算(如x&x或x-x)操作。由於計算的性質,這一行動似乎沒有意義,並可能表明錯誤或邏輯錯誤。 |
|
SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH |
SF: Dead store due to switch statement fall through |
在swtich中先前的case值因為swtich執行失敗而被覆寫,這就像是忘記使用break推出或者沒有使用return語句放回先前的值一樣。 |
|
SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_THROW |
SF: Dead store due to switch statement fall through to throw |
在swtich中因為出現異常而忽略了對case值的儲存。 |
|
SIC_THREADLOCAL_DEADLY_EMBRACE |
SIC: Deadly embrace of non-static inner class and thread local |
如果是一個靜態內部類。實際上,在內部類和當前執行緒有死鎖的可能。由於內部類不是靜態的,它保留了對外部類的引用。如果執行緒包含對一個內部類例項的引用,那麼內外例項的例項都可以被獲取,這樣就不具備垃圾會回收的資格。 |
|
SIO_SUPERFLUOUS_INSTANCEOF |
SIO: Unnecessary type check done using instanceof operator |
在進行instanceof操作時進行沒有必要的型別檢查 |
|
STI_INTERRUPTED_ON_CURRENTTHREAD |
STI: Unneeded use of currentThread() call, to call interrupted() |
此方法呼叫Thread.currentThread()呼叫,只需呼叫interrupted()方法。由於interrupted()是一個靜態方法, Thread.interrupted()更簡單易用。 |
|
STI_INTERRUPTED_ON_UNKNOWNTHREAD |
STI: Static Thread.interrupted() method invoked on thread instance |
呼叫不是當前執行緒物件的Thread.interrupted()方法,由於interrupted()方法是靜態的,interrupted方法將會呼叫一個和作者原計劃不同的物件。 |
|
SE_METHOD_MUST_BE_PRIVATE |
Se: Method must be private in order for serialization to work |
這個類實現了Serializable介面,並定義自定義序列化的方法/反序列化。但由於這種方法不能宣告為private,將被序列化/反序列化的API忽略掉。 |
|
SE_READ_RESOLVE_IS_STATIC |
Se: The readResolve method must not be declared as a static method. |
為使readResolve方法得到序列化機制的識別,不能作為一個靜態方法來宣告。 |
|
UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS |
UMAC: Uncallable method defined in anonymous class |
在匿名類中定義了一個既沒有覆寫超類中方法也不能直接呼叫的方法。因為在其他類的方法不能直接引用匿名類宣告的方法,似乎這種方法不能被呼叫,這種方法可能只是沒有任何作用的程式碼,但也可能覆寫超類中宣告。 |
|
UR_UNINIT_READ |
UR: Uninitialized read of field in constructor |
此構造方法中使用了一個尚未賦值的欄位或屬性。 |
|
DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY |
USELESS_STRING: Invocation of toString on an array |
該程式碼呼叫上匿名陣列的toString()方法,產生的結果形如[@ 16f0472並沒有實際的意義。考慮使用Arrays.toString方法來轉換成可讀的字串,提供該陣列的內容陣列。例如: |
|
UWF_NULL_FIELD |
UwF: Field only ever set to null |
欄位的值總是為null值,所有讀取該欄位的值都為null。檢查錯誤,如果它確實沒有用就刪除掉。 |
|
UWF_UNWRITTEN_FIELD |
UwF: Unwritten field |
此欄位是永遠不會寫入值。所有讀取將返回預設值。檢查錯誤(如果它被初始化?),如果它確實沒有用就刪除掉。 |
|
DM_CONVERT_CASE |
Dm: Consider using Locale parameterized version of invoked method |
使用平臺預設的編碼格式對字串進行大小寫轉換,這可能導致國際字元的轉換不當。使用以下方式對字元進行轉換 |
|
DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED |
DP: Classloaders should only be created inside doPrivileged block |
類載入器只能建立在特殊的方法體內 |
|
EI_EXPOSE_REP |
EI: May expose internal representation by returning reference to mutable object |
返回一個易變物件引用並把它儲存在物件欄位中時會暴露物件內部的欄位描述,如果接受不守信任的程式碼訪問或者沒有檢查就去改變易變物件的會涉及物件的安全和其他重要屬性的安全。返回一個物件的新副本,在很多情況下更好的辦法。 |
|
EI_EXPOSE_REP2 |
EI2: May expose internal representation by incorporating reference to mutable object |
此程式碼把外部可變物件引用儲存到物件的內部表示。如果例項受到不信任的程式碼的訪問和沒有檢查的變化危及物件和重要屬性的安全。儲存一個物件的副本,在很多情況下是更好的辦法。 |
|
FI_PUBLIC_SHOULD_BE_PROTECTED |
FI: Finalizer should be protected, not public |
一個類中的finalize()方法必須宣告為protected,而不能為public型別 |
|
MS_EXPOSE_REP |
MS: Public static method may expose internal representation by returning array |
一個public型別的靜態方法返回一個陣列,可能引用內部屬性的暴露。任何程式碼呼叫此方法都可以自由修改底層陣列。一個解決辦法是返回一個陣列的副本。 |
|
MS_FINAL_PKGPROTECT |
MS: Field should be both final and package protected |
一個靜態欄位可能被惡意程式碼或另外一個包所改變的。欄位可以放到protected包中也可以定義為final型別的以避免此問題。 |
|
MS_MUTABLE_ARRAY |
MS: Field is a mutable array |
一個定義為final型別的靜態欄位引用一個陣列時它可以被惡意程式碼或在另其他包中所使用。這些程式碼可以自由修改陣列的內容。 |
|
MS_MUTABLE_HASHTABLE |
MS: Field is a mutable Hashtable |
一個定義為final型別的靜態欄位引用一個Hashtable時可以被惡意程式碼或者在其他包中被呼叫,這些方法可以修改Hashtable的值。 |
|
MS_OOI_PKGPROTECT |
MS: Field should be moved out of an interface and made package protected |
將域儘量不要定義在介面中,並宣告為包保護在介面中定義了一個final型別的靜態欄位,如陣列或雜湊表等易變物件。這些物件可以被惡意程式碼或者在其他包中被呼叫,為了解決這個問題,需要把它定義到一個具體的實體類中並且宣告為保護型別以避免這種錯誤。 |
|
MS_PKGPROTECT |
MS: Field should be package protected |
一個靜態欄位是可以改變的惡意程式碼或其他的包訪問修改。可以把這種型別的欄位宣告為final型別的以防止這種錯誤。 |
|
DM_MONITOR_WAIT_ON_CONDITION |
Dm: Monitor wait() called on Condition |
方法中以java.util.concurrent.locks.Condition物件呼叫wait()。等待一個條件發生時應該使用在Condition介面中定義的await()方法。 |
|
DM_USELESS_THREAD |
Dm: A thread was created using the default empty run method |
這個方法沒有透過run方法或者具體宣告Thread類,也沒有透過一個Runnable物件去定義一個執行緒,而這個執行緒出來浪費資源卻什麼也沒有去做。 |
|
ESync_EMPTY_SYNC |
ESync: Empty synchronized block |
該程式碼包含一個空的同步塊:synchronized() {} |
|
IS2_INCONSISTENT_SYNC |
IS: Inconsistent synchronization |
不合理的同步 |
|
IS_FIELD_NOT_GUARDED |
IS: Field not guarded against concurrent access |
域不是良好的同步訪問---此欄位被標註為net.jcip.annotations.GuardedBy,但可以在某種程度上違反註釋而去訪問 |
|
JLM_JSR166_LOCK_MONITORENTER |
JLM: Synchronization performed on Lock |
實現java.util.concurrent.locks.Lock的物件呼叫了同步的方法。應該這樣處理,物件被鎖定/解鎖時使用acquire()/ release()方法而不是使用同步的方法。 |
|
LI_LAZY_INIT_STATIC |
LI: Incorrect lazy initialization of static field |
靜態域不正確的延遲初始化-- |
|
LI_LAZY_INIT_UPDATE_STATIC |
LI: Incorrect lazy initialization and update of static field |
這種方法包含一個不同步延遲初始化的靜態欄位。之後為欄位賦值,物件儲存到該位置後進一步更新或訪問。欄位後儘快讓其他執行緒能夠訪問。如果該方法的進一步訪問該欄位為初始化物件提供服務,然後你有一個非常嚴重的多執行緒bug,除非別的東西阻止任何其他執行緒訪問儲存的物件,直到它完全初始化。即使你有信心,該方法是永遠不會被多個執行緒呼叫時,在它的值還沒有被充分初始化或移動,不把它設定為static欄位時它可能會更好。 |
|
ML_SYNC_ON_UPDATED_FIELD |
ML: Method synchronizes on an updated field |
物件獲取一個可變欄位時進行同步。這是沒有意義的,因為不同的執行緒可以在不同的物件同步。 |
|
MSF_MUTABLE_SERVLET_FIELD |
MSF: Mutable servlet field |
一個web服務一般只能建立一個servlet或者jsp的例項(例如:treates是一個單利類),它會被多個執行緒呼叫這個例項的方法服務於多個同時的請求。因此使用易變的欄位屬性產生競爭的情況。 |
|
MWN_MISMATCHED_NOTIFY |
MWN: Mismatched notify() |
此方法呼叫Object.notify()或Object.notifyAll()而沒有獲取到該物件的物件鎖。呼叫notify()或notifyAll()而沒有持有該物件的物件鎖,將導致IllegalMonitorStateException異常。 |
|
MWN_MISMATCHED_WAIT |
MWN: Mismatched wait() |
此方法呼叫Object.wait()而沒有獲取到該物件的物件鎖。呼叫wait()而沒有持有該物件的物件鎖,將導致IllegalMonitorStateException異常。 |
|
NP_SYNC_AND_NULL_CHECK_FIELD |
NP: Synchronize and null check on the same field. |
如果程式碼塊是同步的,那麼久不可能為空。如果是空,同步時就會丟擲NullPointerException異常。最好是在另一個程式碼塊中進行同步。 |
|
NO_NOTIFY_NOT_NOTIFYALL |
No: Using notify() rather than notifyAll() |
呼叫notify()而不是notifyAll()方法。 Java的監控器通常用於多個條件。呼叫notify()只喚醒一個執行緒,這意味著該執行緒被喚醒只是滿足的當前的唯一條件。 |
|
RS_READOBJECT_SYNC |
RS: Class's readObject() method is synchronized |
序列化類中定義了同步的readObject()。透過定義,反序列化建立的物件只有一個執行緒可以訪問,因此沒有必要的readObject()進行同步。如果的readObject()方法本身造成物件對另一個執行緒可見,那麼這本身就是不好的編碼方式。 |
|
RU_INVOKE_RUN |
Ru: Invokes run on a thread (did you mean to start it instead?) |
這種方法顯式呼叫一個物件的run()。一般來說,類是實現Runnable介面的,因為在一個新的執行緒他們將有自己的run()方法,在這種情況下Thread.start()方法呼叫是正確的。 |
|
SC_START_IN_CTOR |
SC: Constructor invokes Thread.start() |
在建構函式中啟動一個執行緒。如果類曾經被子類擴充套件過,那麼這很可能是錯的,因為執行緒將在子類構造之前開始啟動。 |
|
SP_SPIN_ON_FIELD |
SP: Method spins on field |
方法無限迴圈讀取一個欄位。編譯器可合法懸掛宣讀迴圈,變成一個無限迴圈的程式碼。這個類應該改變,所以使用適當的同步(包括等待和通知要求) |
|
STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE |
STCAL: Call to static Calendar |
即使JavaDoc對此不包含暗示,而Calendars本身在多執行緒中使用就是不安全的。探測器發現當呼叫Calendars的例項時將會獲得一個靜態物件。Calendar rightNow = Calendar.getInstance(); |
|
STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE |
STCAL: Call to static DateFormat |
在官方的JavaDoc,DateFormats多執行緒使用本事就是不安全的。探測器發現呼叫一個DateFormat的例項將會獲得一個靜態物件。 |
|
STCAL_STATIC_CALENDAR_INSTANCE |
STCAL: Static Calendar field |
Calendar在多執行緒中本身就是不安全的,如果線上程範圍中共享一個Calendarde 例項而不使用一個同步的方法在應用中就會出現一些奇怪的行為。在sun.util.calendar.BaseCalendar.getCalendarDateFromFixedDate()中會丟擲ArrayIndexOutOfBoundsExceptions or IndexOutOfBoundsExceptions異常。 |
|
STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE |
STCAL: Static DateFormat |
DateFormat 在多執行緒中本身就是不安全的,如果線上程範圍中共享一個DateFormat的例項而不使用一個同步的方法在應用中就會出現一些奇怪的行為。 |
|
SWL_SLEEP_WITH_LOCK_HELD |
SWL: Method calls Thread.sleep() with a lock held |
當持有物件時呼叫Thread.sleep()。這可能會導致很差的效能和可擴充套件性,或陷入死鎖,因為其他執行緒可能正在等待獲得鎖。呼叫wait()是一個更好的主意,釋放物件的持有以允許其他執行緒執行。 |
|
UG_SYNC_SET_UNSYNC_GET |
UG: Unsynchronized get method, synchronized set method |
這個類包含類似命名的get和set方法。在set方法是同步方法和get方法是非同步方法。這可能會導致在執行時的不正確行為,因為呼叫的get方法不一定返回物件一致狀態。 GET方法應該同步。 |
|
UL_UNRELEASED_LOCK |
UL: Method does not release lock on all paths |
方法獲得了當前的物件所,但是在方法中始終沒有釋放它。一個正確的示例如下: |
|
UL_UNRELEASED_LOCK_EXCEPTION_PATH |
UL: Method does not release lock on all exception paths |
方法獲得了當前的物件所,但是在所有的異常處理中始終沒有釋放它。一個正確的示例如下: |
|
UW_UNCOND_WAIT |
UW: Unconditional wait |
方法中包含呼叫java.lang.Object.wait(),而卻沒有放到條件流程控制中。該程式碼應確認條件尚未滿足之前等待;先前任何通知將被忽略。 |
|
VO_VOLATILE_REFERENCE_TO_ARRAY |
VO: A volatile reference to an array doesn't treat the array elements as volatile |
宣告一個變數引用陣列,這可能不是你想要的。如果一個變數引用陣列,那麼對引用陣列的讀和寫都是不安全的,但是陣列元素不是變數。取得陣列的變數值你可以使用java.util.concurrent包中的陣列的原子性特性 |
|
WS_WRITEOBJECT_SYNC |
WS: Class's writeObject() method is synchronized but nothing else is |
這個類有一個writeObject()方法是同步的,但是這個類中沒有其他的同步方法。 |
|
WA_AWAIT_NOT_IN_LOOP |
Wa: Condition.await() not in loop |
方法沒有在迴圈中呼叫java.util.concurrent.await()。如果物件是用於多種條件,打算呼叫wait()方法的條件可能不是實際發生的。 |
|
WA_NOT_IN_LOOP |
Wa: Wait not in loop |
這種方法包含呼叫java.lang.Object.wait(),而這並不是一個迴圈。如果監視器用於多個條件,打算呼叫wait()方法的條件可能不是實際發生的。 |
|
BX_BOXING_IMMEDIATELY_UNBOXED |
Bx: Primitive value is boxed and then immediately unboxed |
對原始值進行裝箱,然後立即取消裝箱。這可能是在一個未要求裝箱的地方進行了手動裝箱,從而迫使編譯器進行立即撤消裝箱的操作 |
|
BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION |
Bx: Primitive value is boxed then unboxed to perform primitive coercion |
對原始值進行裝箱然後立即把它強制轉換為另外一種原始型別。例如: |
|
BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR |
Bx: Primitive value is unboxed and coerced for ternary operator |
在三元運算子操作時如果沒有對值進行封裝或者型別轉換。例如:b ? e1 : e2 |
|
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例項。 |
|
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例項。 |
|
DMI_BLOCKING_METHODS_ON_URL |
Dm: The equals and hashCode methods of URL are blocking |
使用equals和hashCode方法來對url進行資源識別符號解析時會引起堵塞。考慮使用java.net.URI來代替。 |
|
DMI_COLLECTION_OF_URLS |
Dm: Maps and sets of URLs can be performance hogs |
方法或者欄位使用url的map/set集合。因為equals方法或者hashCode方法來進行資源識別符號解析時都會引起堵塞。考慮使用java.net.URI來代替。 |
|
DM_BOOLEAN_CTOR |
Dm: Method invokes inefficient Boolean constructor; use Boolean.valueOf(...) instead |
使用new方法建立一個java.lang.Boolean型別能夠的例項物件是浪費空間的,因為Boolean物件是不可變的而且只有兩個有用的值。使用Boolean.valueOf()或者Java1.5中的自動裝箱功能來建立一個Boolean例項。 |
|
DM_GC |
Dm: Explicit garbage collection; extremely dubious except in benchmarking code |
在程式碼中顯式的呼叫垃圾回收命名,這樣做並不能起作用。在過去,有人在關閉操作或者finalize方法中呼叫垃圾回收方法導致了很多的效能浪費。這樣大規模回收物件時會造成處理器執行緩慢。 |
|
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) |
|
DM_STRING_CTOR |
Dm: Method invokes inefficient new String(String) constructor |
使用java.lang.String(String)建構函式會浪費記憶體因為這種構造方式和String作為引數在功能上容易混亂。只是使用String直接作為引數的形式 |
|
DM_STRING_TOSTRING |
Dm: Method invokes toString() method on a String |
呼叫String.toString()是多餘的操作,只要使用String就可以了。 |
|
DM_STRING_VOID_CTOR |
Dm: Method invokes inefficient new String() constructor |
使用沒有引數的構造方法去建立新的String物件是浪費記憶體空間的,因為這樣建立會和空字串“”混淆。Java中保證完成相同的構造方法會產生描繪相同的String物件。所以你只要使用空字串來建立就可以了。 |
|
ITA_INEFFICIENT_TO_ARRAY |
ITA: Method uses toArray() with zero-length array argument |
當使用集合的toArray()方法時使用陣列長度為0的陣列作為引數。比這更有效的一種方法是myCollection.toArray(new Foo[myCollection.size()]),如果陣列的長度足夠大就可以直接把集合中的內容包裝到陣列中直接返回從而避免了第二次建立一個新的陣列來存放集合中值。 |
|
SS_SHOULD_BE_STATIC |
SS: Unread field: should this field be static? |
類中所包含的final屬性欄位在編譯器中初始化為靜態的值。考慮在定義時就把它定義為static型別的。 |
|
UPM_UNCALLED_PRIVATE_METHOD |
UPM: Private method is never called |
定義為Private型別方法從未被呼叫,應該被刪除。 |
|
URF_UNREAD_FIELD |
UrF: Unread field |
類中定義的屬性從未被呼叫,建議刪除。 |
|
UUF_UNUSED_FIELD |
UuF: Unused field |
類中定義的屬性從未被使用,建議刪除。 |
|
WMI_WRONG_MAP_ITERATOR |
WMI: Inefficient use of keySet iterator instead of entrySet iterator |
當方法中接受一個Map型別的引數時,使用keySet的迭代器比使用entrySet的迭代器效率要高。 |
|
DMI_CONSTANT_DB_PASSWORD |
Dm: Hardcoded constant database password |
程式碼中建立DB的密碼時採用了寫死的密碼。 |
|
DMI_EMPTY_DB_PASSWORD |
Dm: Empty database password |
建立資料庫連線時沒有為資料庫設定密碼,這會使資料庫沒有必要的保護。 |
|
HRS_REQUEST_PARAMETER_TO_COOKIE |
HRS: HTTP cookie formed from untrusted input |
此程式碼使用不受信任的HTTP引數構造一個HTTP Cookie。 |
|
HRS_REQUEST_PARAMETER_TO_HTTP_HEADER |
HRS: HTTP Response splitting vulnerability |
在程式碼中直接把一個HTTP的引數寫入一個HTTP標頭檔案中,它為HTTP的響應暴露了漏洞。 |
|
SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE |
SQL: Nonconstant string passed to execute or addBatch method on an SQL statement |
該方法以字串的形式來呼叫SQLstatement的execute方法,它似乎是動態生成SQL語句的方法。這會更容易受到SQL隱碼攻擊。 |
|
XSS_REQUEST_PARAMETER_TO_JSP_WRITER |
XSS: JSP reflected cross site scripting vulnerability |
在程式碼中在JSP輸出中直接寫入一個HTTP引數,這會造成一個跨站點的指令碼漏洞。 |
|
XSS_REQUEST_PARAMETER_TO_SEND_ERROR |
XSS: Servlet reflected cross site scripting vulnerability in error page |
在程式碼中在Servlet輸出中直接寫入一個HTTP引數,這會造成一個跨站點的指令碼漏洞。 |
|
XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER |
XSS: Servlet reflected cross site scripting vulnerability |
程式碼直接寫入引數的HTTP伺服器錯誤頁(使用HttpServletResponse.sendError)。表達了類似的不受信任的輸入會引起跨站點指令碼漏洞。 |
|
BC_BAD_CAST_TO_ABSTRACT_COLLECTION |
BC: Questionable cast to abstract collection |
在程式碼投把一個集合強制型別轉換為一個抽象的集合(如list,set或map)。保證該物件型別和將要轉換的型別是一致的。如果你只是想要便利一個集合,那麼你就不必將它轉換為Set或List。 |
|
BC_BAD_CAST_TO_CONCRETE_COLLECTION |
BC: Questionable cast to concrete collection |
程式碼把抽象的集合(如List,Set,或Collection)強制轉換為具體落實型別(如一個ArrayList或HashSet)。這可能不正確,也可能使您的程式碼很脆弱,因為它使得難以在今後的切換指向其他具體實現。除非你有特別理由這樣做,否則只需要使用抽象的集合類。 |
|
BC_UNCONFIRMED_CAST |
BC: Unchecked/unconfirmed cast |
強制型別轉換操作沒有經過驗證,而且不是所有的此種型別裝換過的類都可以再強制型別轉換為原型別。在程式碼中需要進行邏輯判斷以保證可以進行這樣的操作。 |
|
BC_VACUOUS_INSTANCEOF |
BC: instanceof will always return true |
instanceof測試將始終返回真(除非被測試的值為空)。雖然這是安全,確保它是不是說明一些誤解或其他一些邏輯錯誤。如果你真的想測試是空的價值,也許會更清楚這樣做的更好空試驗,而不是一個instanceof測試。 |
|
ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT |
BSHIFT: Unsigned right shift cast to short/byte |
無符號數右移後進行轉換為short或者byte型別時可能會丟棄掉高位的值,這樣的結果就是有符合數和無符號數無法區分(這取決於移位大小) |
|
CI_CONFUSED_INHERITANCE |
CI: Class is final but declares protected field |
這個類被宣告為final的,而是欄位屬性卻宣告為保護型別的。由於是final類,它不能再被繼承,而再宣告為保護型別的很容易造成混淆。為了從外部能正確的使用它應該把它們宣告為private或者public型別。 |
|
DB_DUPLICATE_BRANCHES |
DB: Method uses the same code for two branches |
此方法使用相同的程式碼,以實現兩個有條件的分支。檢查以確保這是不是一個編碼錯誤。 |
|
DB_DUPLICATE_SWITCH_CLAUSES |
DB: Method uses the same code for two switch clauses |
他的方法使用相同的程式碼來實現兩個switch的宣告條款。這可能是重複程式碼的情況,但可能也顯示出編碼的錯誤。 |
|
DLS_DEAD_LOCAL_STORE |
DLS: Dead store to local variable |
該指令為區域性變數賦值,但在其後的沒有對她做任何使用。通常,這表明一個錯誤,因為值從未使用過。 |
|
DLS_DEAD_LOCAL_STORE_IN_RETURN |
DLS: Useless assignment in return statement |
本宣告把一個區域性變數放到方法的返回語句中。這對於方法中區域性變數來說是沒有意思的。 |
|
DLS_DEAD_LOCAL_STORE_OF_NULL |
DLS: Dead store of null to local variable |
把一個本地變數賦值為null值,並且再也沒有對這個變數做任何的操作。這樣可能是為了垃圾回收,而是Java SE 6.0,這已不再需要。 |
|
DMI_HARDCODED_ABSOLUTE_FILENAME |
DMI: Code contains a hard coded reference to an absolute pathname |
此程式碼包含檔案物件為一個絕對路徑名 |
|
DMI_NONSERIALIZABLE_OBJECT_WRITTEN |
DMI: Non serializable object written to ObjectOutput |
程式碼中讓一個非序列化的物件出現在ObjectOutput.writeObject()方法中,這樣會引起一個錯誤。 |
|
DMI_USELESS_SUBSTRING |
DMI: Invocation of substring(0), which returns the original value |
此程式碼呼叫了subString(0)方法,它將返回原來的值。 |
|
EQ_DOESNT_OVERRIDE_EQUALS |
Eq: Class doesn't override equals in superclass |
子類定義了一個新的equals方法但是卻不是覆寫了父類本省的equals()方法。 |
|
FE_FLOATING_POINT_EQUALITY |
FE: Test for floating point equality |
此操作比較兩個浮點值是否相等。由於浮點運算可能會涉及到舍入,計算float和double值可能不準確。如果要求值必須準確,如貨幣值,可以考慮使用固定精度型別,如BigDecimal型別的值來比較 |
|
VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN |
FS: Non-Boolean argument formatted using %b format specifier |
使用%b去格式化Boolean型別的值不正確的但是它不會丟擲異常,任何非空的值都會輸出true,任何為空的值都會輸出false |
|
IC_INIT_CIRCULARITY |
IC: Initialization circularity |
在引用兩個相互呼叫為環狀static方法去初始化一個例項時是錯誤的。 |
|
ICAST_IDIV_CAST_TO_DOUBLE |
ICAST: Integral division result cast to double or float |
整形數除法強制轉換為double或者float型別。 |
|
IM_AVERAGE_COMPUTATION_COULD_OVERFLOW |
IM: Computation of average could overflow |
程式碼中使用x % 2 == 1的方法去驗證運算是否存在餘數的情況,但是如果出現負數的情況就不起作用了。使用x & 1 == 1, or x % 2 != 0來代替 |
|
INT_VACUOUS_COMPARISON |
INT: Vacuous comparison of integer value |
整形數進行比較結果總是不變。例如:x <= Integer.MAX_VALUE |
|
MTIA_SUSPECT_SERVLET_INSTANCE_FIELD |
MTIA: Class extends Servlet class and uses instance variables |
這個類擴充套件從Servlet類,並使用例項的成員變數。由於只有一個Servlet類的例項,並在多執行緒方式使用,這種模式有可能存在問題。考慮只使用方法的區域性變數。 |
|
MTIA_SUSPECT_STRUTS_INSTANCE_FIELD |
MTIA: Class extends Struts Action class and uses instance variables |
類擴充套件自Struts的Action類並使用這個例項的成員變數,因為在Struts框架中只存在一個Action例項物件並且使用在多執行緒的情況下很可能會出現問題。 |
|
NP_DEREFERENCE_OF_READLINE_VALUE |
NP: Dereference of the result of readLine() without nullcheck |
對readLine()的結果值沒有進行判空操作就去重新賦值,這樣的操作可以會丟擲空指標異常。 |
|
NP_IMMEDIATE_DEREFERENCE_OF_READLINE |
NP: Immediate dereference of the result of readLine() |
對readLine()的結果立即賦值,這樣的操作可以會丟擲空指標異常。 |
|
NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE |
NP: Possible null pointer dereference due to return value of called method |
方法的返回值沒有進行是否為空的檢查就重新賦值,這樣可能會出現空指標異常。 |
|
NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE |
NP: Parameter must be non-null but is marked as nullable |
引數值在任何情況下都不能為空,但是有明確的註釋它可以為空。 |
|
NS_DANGEROUS_NON_SHORT_CIRCUIT |
NS: Potentially dangerous use of non-short-circuit logic |
程式碼中使用(& or |)代替(&& or ||)操作,這會造成潛在的危險。 |
|
NS_NON_SHORT_CIRCUIT |
NS: Questionable use of non-short-circuit logic |
程式碼中使用(& or |)代替(&& or ||)操作,會引起不安全的操作 |
|
PZLA_PREFER_ZERO_LENGTH_ARRAYS |
PZLA: Consider returning a zero length array rather than null |
考慮返回一個零長度的陣列,而不是null值 |
|
QF_QUESTIONABLE_FOR_LOOP |
QF: Complicated, subtle or wrong increment in for-loop |
確定這個迴圈是正確的變數遞增,看起來,另一個變數被初始化,檢查的迴圈。這是由於for迴圈中太複雜的定義造成的。 |
|
RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE |
RCN: Redundant comparison of non-null value to null |
方法中包含一個不能為空的賦值還包含一個可以為空的賦值。冗餘比較非空值為空。 |
|
RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES |
RCN: Redundant comparison of two null values |
方法中對兩個null值進行比較 |
|
RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE |
RCN: Redundant nullcheck of value known to be non-null |
方法中對不為空的值進行為空的判斷。 |
|
REC_CATCH_EXCEPTION |
REC: Exception is caught when Exception is not thrown |
在try/catch塊中捕獲異常,但是異常沒有在try語句中丟擲而RuntimeException又沒有明確的被捕獲 |
|
RI_REDUNDANT_INTERFACES |
RI: Class implements same interface as superclass |
子類和父類都實現了同一個介面,這種定義是多餘的。 |
|
RV_DONT_JUST_NULL_CHECK_READLINE |
RV: Method discards result of readLine after checking if it is non-null |
readLine方法的結果不為空時被拋棄 |
|
RV_REM_OF_RANDOM_INT |
RV: Remainder of 32-bit signed random integer |
此程式碼生成一個隨機的符號整數,然後計算另一個值的。由於隨機數可以是負數,所以其餘操作的結果也可以是負面的。考慮使用Random.nextInt(int)方法代替。 |
|
SA_FIELD_DOUBLE_ASSIGNMENT |
SA: Double assignment of field |
方法中的欄位包含了雙重任務,例如: |
|
SA_LOCAL_DOUBLE_ASSIGNMENT |
SA: Double assignment of local variable |
為一個區域性變數兩次賦值,這樣是沒有意義的。例如: |
|
SA_LOCAL_SELF_ASSIGNMENT |
SA: Self assignment of local variable |
區域性變數使用自身給自己賦值 |
|
SF_SWITCH_FALLTHROUGH |
SF: Switch statement found where one case falls through to the next case |
Switch語句中一個分支執行後又執行了下一個分支。通常case後面要跟break 或者return語句來跳出。 |
|
SF_SWITCH_NO_DEFAULT |
SF: Switch statement found where default case is missing |
Switch沒有預設情況下執行的case語句。 |
|
SE_PRIVATE_READ_RESOLVE_NOT_INHERITED |
Se: Private readResolve method not inherited by subclasses |
宣告為private的序列化方法被子類繼承 |
|
UCF_USELESS_CONTROL_FLOW |
UCF: Useless control flow |
沒有任何作用的條件語句。 |
|
UCF_USELESS_CONTROL_FLOW_NEXT_LINE |
UCF: Useless control flow to next line |
無效的條件控制語句,注意if (argv.length == 1);以“;”結尾,下面的語句無論是否滿足都會執行。 |
|
XFB_XML_FACTORY_BYPASS |
XFB: Method directly allocates a specific implementation of xml interfaces |
方法自定義了一種XML介面的實現類。最好是使用官方提供的工廠類來建立這些物件,以便可以在執行期中改變。例如: |