1. 程式人生 > >FindBugs規則整理-下

FindBugs規則整理-下

86.RV: Method ignores return value (RV_RETURN_VALUE_IGNORED)
該方法的返回值應該進行檢查。這種警告通常出現在呼叫一個不可變物件的方法,認為它更新了物件的值。例如:String dateString = getHeaderField(name);
dateString.trim();
程式設計師似乎以為trim()方法將更新dateString引用的字串。但由於字串是不可改變的,trim()函式返回一個新字串值,在這裡它是被忽略了。該程式碼應更正:
String dateString = getHeaderField(name);
dateString = dateString.trim();
87.RpC: Repeated conditional tests (RpC_REPEATED_CONDITIONAL_TEST)
該程式碼包含對同一個條件試驗了兩次,兩邊完全一樣例如:(如X == 0 | | x == 0)。可能第二次出現是打算判斷別的不同條件(如X == 0 | | y== 0)。
88.SA: Double assignment of field (SA_FIELD_DOUBLE_ASSIGNMENT)
方法中的欄位包含了雙重任務,例如:
 int x;
  public void foo() {
   x = x = 17;
  }
這種為變數賦值是無用的,並可能表明一個邏輯錯誤或拼寫錯誤。
89.SA: Self assignment of field (SA_FIELD_SELF_ASSIGNMENT)
方法中包含自己對自己賦值的欄位。例如:
int x;
  public void foo() {
    x = x;
  }
90.SA: Self comparison of field with itself (SA_FIELD_SELF_COMPARISON)
欄位自己進行自比較可能表明錯誤或邏輯錯誤。
91.SA: Self comparison of value with itself (SA_LOCAL_SELF_COMPARISON)
方法中對一個區域性變數自身進行比較運算,並可說明錯誤或邏輯錯誤。請確保您是比較正確的事情。
92.SA: Nonsensical self computation involving a variable (e.g., x & x) (SA_LOCAL_SELF_COMPUTATION)
此方法對同一變數執行了荒謬的計算(如x&x或x-x)操作。由於計算的性質,這一行動似乎沒有意義,並可能表明錯誤或邏輯錯誤。
93.SF: Dead store due to switch statement fall through (SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH)
在swtich中先前的case值因為swtich執行失敗而被覆寫,這就像是忘記使用break推出或者沒有使用return語句放回先前的值一樣。
94.SF: Dead store due to switch statement fall through to throw (SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_THROW)
在swtich中因為出現異常而忽略了對case值的儲存。
95.SIC: Deadly embrace of non-static inner class and thread local (SIC_THREADLOCAL_DEADLY_EMBRACE)
如果是一個靜態內部類。實際上,在內部類和當前執行緒有死鎖的可能。由於內部類不是靜態的,它保留了對外部類的引用。如果執行緒包含對一個內部類例項的引用,那麼內外例項的例項都可以被獲取,這樣就不具備垃圾會回收的資格。
96.SIO: Unnecessary type check done using instanceof operator (SIO_SUPERFLUOUS_INSTANCEOF)
在進行instanceof操作時進行沒有必要的型別檢查
97.STI: Unneeded use of currentThread() call, to call interrupted() (STI_INTERRUPTED_ON_CURRENTTHREAD)
此方法呼叫Thread.currentThread()呼叫,只需呼叫interrupted()方法。由於interrupted()是一個靜態方法, Thread.interrupted()更簡單易用。
98.STI: Static Thread.interrupted() method invoked on thread instance (STI_INTERRUPTED_ON_UNKNOWNTHREAD)
呼叫不是當前執行緒物件的Thread.interrupted()方法,由於interrupted()方法是靜態的,interrupted方法將會呼叫一個和作者原計劃不同的物件。
99.Se: Method must be private in order for serialization to work (SE_METHOD_MUST_BE_PRIVATE)
這個類實現了Serializable介面,並定義自定義序列化的方法/反序列化。但由於這種方法不能宣告為private,將被序列化/反序列化的API忽略掉。
100.Se: The readResolve method must not be declared as a static method. (SE_READ_RESOLVE_IS_STATIC)
為使readResolve方法得到序列化機制的識別,不能作為一個靜態方法來宣告。
101.UMAC: Uncallable method defined in anonymous class (UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS)
在匿名類中定義了一個既沒有覆寫超類中方法也不能直接呼叫的方法。因為在其他類的方法不能直接引用匿名類宣告的方法,似乎這種方法不能被呼叫,這種方法可能只是沒有任何作用的程式碼,但也可能覆寫超類中宣告。
102.UR: Uninitialized read of field in constructor (UR_UNINIT_READ)
此構造方法中使用了一個尚未賦值的欄位或屬性。
 String a;
 public SA() {
String abc = a;
System.out.println(abc);
 }
103.UR: Uninitialized read of field method called from constructor of superclass (UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR)
方法被超類的建構函式呼叫時,在當前類中的欄位或屬性還沒有被初始化。例如:
abstract class A {
  int hashCode;
  abstract Object getValue();
  A() {
    hashCode = getValue().hashCode();
    }
  }
class B extends A {
  Object value;
  B(Object v) {
    this.value = v;
    }
  Object getValue() {
    return value;
  }
  }
當B是建立時,A的建構函式將在B為value賦值之前觸發,然而在A的初始化方法呼叫getValue方法時value這個變數還沒有被初始化。
104.USELESS_STRING: Invocation of toString on an array (DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY)
該程式碼呼叫上匿名陣列的toString()方法,產生的結果形如[@ 16f0472並沒有實際的意義。考慮使用Arrays.toString方法來轉換成可讀的字串,提供該陣列的內容陣列。例如:
String[] a = { "a" };
System.out.println(a.toString());
//正確的使用為
System.out.println(Arrays.toString(a));
105.USELESS_STRING: Invocation of toString on an array (DMI_INVOKING_TOSTRING_ON_ARRAY)
該程式碼呼叫上陣列的toString()方法,產生的結果形如[@ 16f0472並不能顯示陣列的真實內容。考慮使用Arrays.toString方法來轉換成可讀的字串,提供該陣列的內容陣列
106.UwF: Field only ever set to null (UWF_NULL_FIELD)
欄位的值總是為null值,所有讀取該欄位的值都為null。檢查錯誤,如果它確實沒有用就刪除掉。
107.UwF: Unwritten field (UWF_UNWRITTEN_FIELD
此欄位是永遠不會寫入值。所有讀取將返回預設值。檢查錯誤(如果它被初始化?),如果它確實沒有用就刪除掉。
五:Performance關於程式碼效能相關方面的
1.Bx: Primitive value is boxed and then immediately unboxed (BX_BOXING_IMMEDIATELY_UNBOXED)
對原始值進行裝箱,然後立即取消裝箱。這可能是在一個未要求裝箱的地方進行了手動裝箱,從而迫使編譯器進行立即撤消裝箱的操作
2.Bx: Primitive value is boxed then unboxed to perform primitive coercion (BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION)
對原始值進行裝箱然後立即把它強制轉換為另外一種原始型別。例如:
new Double(d).intValue()應該直接進行強制轉換例如:(int) d
3.Bx: Method allocates a boxed primitive just to call toString (DM_BOXED_PRIMITIVE_TOSTRING)
僅僅為了呼叫封裝類的toString()而對原始型別進行封裝操作。比這種方法更有效的是呼叫封裝類的toString(…)方法例如:
new Integer(1).toString()    替換為   Integer.toString(1)
new Long(1).toString()    替換為   Long.toString(1)
new Float(1.0).toString()    替換為   Float.toString(1.0)
new Double(1.0).toString()    替換為   Double.toString(1.0)
new Byte(1).toString()    替換為   Byte.toString(1)
new Short(1).toString()    替換為   Short.toString(1)
new Boolean(true).toString()    替換為   Boolean.toString(true)
4.Bx: Method invokes inefficient floating-point Number constructor; use static valueOf instead (DM_FP_NUMBER_CTOR)
使用new Double(double)方法總是會建立一個新的物件,然而使用Double.valueOf(double)方法可以把值儲存在編輯器或者class library、JVM中。使用儲存值的方式來避免物件的分配可以或得更好的程式碼效能
除非類必須符合Java 1.5以前的JVM,否則請使用自動裝箱或valueOf()方法建立Double和Float例項。
5.Bx: Method invokes inefficient Number constructor; use static valueOf instead (DM_NUMBER_CTOR)
使用new Integer(int)方法總是會建立一個新的物件,然而使用Integer.valueOf(int)方法可以把值儲存在編輯器或者class library、JVM中。使用儲存值的方式來避免物件的分配可以或得更好的程式碼效能
除非類必須符合Java 1.5以前的JVM,否則請使用自動裝箱或valueOf()方法建立Long, Integer, Short, Character, Byte例項。
6.Dm: The equals and hashCode methods of URL are blocking (DMI_BLOCKING_METHODS_ON_URL)
使用equals和hashCode方法來對url進行資源識別符號解析時會引起堵塞。考慮使用java.net.URI來代替。
7.Dm: Maps and sets of URLs can be performance hogs (DMI_COLLECTION_OF_URLS)
方法或者欄位使用url的map/set集合。因為equals方法或者hashCode方法來進行資源識別符號解析時都會引起堵塞。考慮使用java.net.URI來代替。
8.Dm: Method invokes inefficient Boolean constructor; use Boolean.valueOf(...) instead (DM_BOOLEAN_CTOR)
使用new方法建立一個java.lang.Boolean型別能夠的例項物件是浪費空間的,因為Boolean物件是不可變的而且只有兩個有用的值。使用Boolean.valueOf()或者Java1.5中的自動裝箱功能來建立一個Boolean例項。
9.Dm: Explicit garbage collection; extremely dubious except in benchmarking code (DM_GC)
在程式碼中顯式的呼叫垃圾回收命名,這樣做並不能起作用。在過去,有人在關閉操作或者finalize方法中呼叫垃圾回收方法導致了很多的效能浪費。這樣大規模回收物件時會造成處理器執行緩慢。
10.Dm: Use the nextInt method of Random rather than nextDouble to generate a random integer (DM_NEXTINT_VIA_NEXTDOUBLE)
 如果r是一個java.util.Random物件,你可以使r.nextInt(n)生成一個0到n-1之前的隨機數,而不是使用(int)(r.nextDouble() * n)
11.Dm: Method invokes inefficient new String(String) constructor (DM_STRING_CTOR)
使用java.lang.String(String)建構函式會浪費記憶體因為這種構造方式和String作為引數在功能上容易混亂。只是使用String直接作為引數的形式
12.Dm: Method invokes toString() method on a String (DM_STRING_TOSTRING)
呼叫String.toString()是多餘的操作,只要使用String就可以了。
13.Dm: Method invokes inefficient new String() constructor (DM_STRING_VOID_CTOR)
使用沒有引數的構造方法去建立新的String物件是浪費記憶體空間的,因為這樣建立會和空字串“”混淆。Java中保證完成相同的構造方法會產生描繪相同的String物件。所以你只要使用空字串來建立就可以了。
14.ITA: Method uses toArray() with zero-length array argument (ITA_INEFFICIENT_TO_ARRAY)
當使用集合的toArray()方法時使用陣列長度為0的陣列作為引數。比這更有效的一種方法是
myCollection.toArray(new Foo[myCollection.size()]),如果陣列的長度足夠大就可以直接把集合中的內容包裝到陣列中直接返回從而避免了第二次建立一個新的陣列來存放集合中值。
15.SBSC: Method concatenates strings using + in a loop (SBSC_USE_STRINGBUFFER_CONCATENATION)
在迴圈中構建一個String物件時從效能上講使用StringBuffer來代替String物件
例如:
// This is bad
  String s = "";
  for (int i = 0; i < field.length; ++i) {
    s = s + field[i];
  }


  // This is better
  StringBuffer buf = new StringBuffer();
  for (int i = 0; i < field.length; ++i) {
    buf.append(field[i]);
  }
  String s = buf.toString();
16.SS: Unread field: should this field be static? (SS_SHOULD_BE_STATIC)
類中所包含的final屬性欄位在編譯器中初始化為靜態的值。考慮在定義時就把它定義為static型別的。
17.UM: Method calls static Math class method on a constant value (UM_UNNECESSARY_MATH)
在方法中使用了java.lang.Math的靜態方法代替常量來使用,使用常量速度和準確度會更好。 以下為Math中的方法產生的值。
Method Parameter
abs -any-
acos 0.0 or 1.0
asin 0.0 or 1.0
atan 0.0 or 1.0
atan2 0.0 cbrt 0.0 or 1.0
ceil -any-
cos 0.0
cosh 0.0
exp 0.0 or 1.0
expm1 0.0
floor -any-
log 0.0 or 1.0
log10 0.0 or 1.0
rint -any-
round -any-
sin 0.0
sinh 0.0
sqrt 0.0 or 1.0
tan 0.0
tanh 0.0
toDegrees 0.0 or 1.0
toRadians 0.0
18.UPM: Private method is never called (UPM_UNCALLED_PRIVATE_METHOD)
定義為Private型別方法從未被呼叫,應該被刪除。
19.UrF: Unread field (URF_UNREAD_FIELD)
類中定義的屬性從未被呼叫,建議刪除。
20.UuF: Unused field (UUF_UNUSED_FIELD)
類中定義的屬性從未被使用,建議刪除。
21.WMI: Inefficient use of keySet iterator instead of entrySet iterator (WMI_WRONG_MAP_ITERATOR)
當方法中接受一個Map型別的引數時,使用keySet的迭代器比使用entrySet的迭代器效率要高。
六:Internationalization關於程式碼國際化相關方面的
Dm: Consider using Locale parameterized version of invoked method (DM_CONVERT_CASE)
使用平臺預設的編碼格式對字串進行大小寫轉換,這可能導致國際字元的轉換不當。使用以下方式對字元進行轉換
String.toUpperCase( Locale l )
String.toLowerCase( Locale l )
七:Multithreaded correctness關於程式碼多執行緒正確性相關方面的
1.DL: Synchronization on Boolean could lead to deadlock (DL_SYNCHRONIZATION_ON_BOOLEAN)
該程式碼同步一個封裝的原始常量,例如一個Boolean型別。
private static Boolean inited = Boolean.FALSE;
...
  synchronized(inited) {
    if (!inited) {
       init();
       inited = Boolean.TRUE;
       }
     }
...
由於通常只存在兩個布林物件,此程式碼可能是同步的其他無關的程式碼中相同的物件,這時會導致反應遲鈍和可能死鎖
2.DL: Synchronization on boxed primitive could lead to deadlock (DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE)
該程式碼同步一個封裝的原始常量,例如一個Integer型別。
private static Integer count = 0;
...
  synchronized(count) {
     count++;
     }
...
由於Integer物件可以共享和儲存,此程式碼可能是同步的其他無關的程式碼中相同的物件,這時會導致反應遲鈍和可能死鎖
3.DL: Synchronization on interned String could lead to deadlock (DL_SYNCHRONIZATION_ON_SHARED_CONSTANT)
同步String型別的常量時,由於它被JVM中多個其他的物件所共有,這樣在其他程式碼中會引起死鎖。
4.DL: Synchronization on boxed primitive values (DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE)
同步一個顯然不是共有封裝的原始值,例如一個Integer型別的物件。例如:
private static final Integer fileLock = new Integer(1);
...
  synchronized(fileLock) {
     .. do something ..
     }
...
它最後被定義為以下方式來代替:private static final Object fileLock = new Object();


5.Dm: Monitor wait() called on Condition (DM_MONITOR_WAIT_ON_CONDITION)
方法中以java.util.concurrent.locks.Condition物件呼叫wait()。等待一個條件發生時應該使用在Condition介面中定義的await()方法。
6.Dm: A thread was created using the default empty run method (DM_USELESS_THREAD)
這個方法沒有通過run方法或者具體宣告Thread類,也沒有通過一個Runnable物件去定義一個執行緒,而這個執行緒出來浪費資源卻什麼也沒有去做。
7.ESync: Empty synchronized block (ESync_EMPTY_SYNC)
該程式碼包含一個空的同步塊:synchronized() {}
8.IS: Inconsistent synchronization (IS2_INCONSISTENT_SYNC)
不合理的同步
9.IS: Field not guarded against concurrent access (IS_FIELD_NOT_GUARDED)
域不是良好的同步訪問---


此欄位被標註為net.jcip.annotations.GuardedBy,但可以在某種程度上違反註釋而去訪問
10.JLM: Synchronization performed on Lock (JLM_JSR166_LOCK_MONITORENTER)
實現java.util.concurrent.locks.Lock的物件呼叫了同步的方法。應該這樣處理,物件被鎖定/解鎖時使用acquire()/ release()方法而不是使用同步的方法。
11.LI: Incorrect lazy initialization of static field (LI_LAZY_INIT_STATIC)
靜態域不正確的延遲初始化--
這種方法包含了一個不同步延遲初始化的非volatile靜態欄位。因為編譯器或處理器可能會重新排列指令,如果該方法可以被多個執行緒呼叫,執行緒不能保證看到一個完全初始化的物件。你可以讓欄位可變來解決此問題
12.LI: Incorrect lazy initialization and update of static field (LI_LAZY_INIT_UPDATE_STATIC)
這種方法包含一個不同步延遲初始化的靜態欄位。之後為欄位賦值,物件儲存到該位置後進一步更新或訪問。欄位後儘快讓其他執行緒能夠訪問。如果該方法的進一步訪問該欄位為初始化物件提供服務,然後你有一個非常嚴重的多執行緒bug,除非別的東西阻止任何其他執行緒訪問儲存的物件,直到它完全初始化。
即使你有信心,該方法是永遠不會被多個執行緒呼叫時,在它的值還沒有被充分初始化或移動,不把它設定為static欄位時它可能會更好。
13.ML: Method synchronizes on an updated field (ML_SYNC_ON_UPDATED_FIELD)
物件獲取一個可變欄位時進行同步。這是沒有意義的,因為不同的執行緒可以在不同的物件同步。
14.MSF: Mutable servlet field (MSF_MUTABLE_SERVLET_FIELD)
一個web服務一般只能建立一個servlet或者jsp的例項(例如:treates是一個單利類),它會被多個執行緒呼叫這個例項的方法服務於多個同時的請求。因此使用易變的欄位屬性產生競爭的情況。
15.MWN: Mismatched notify() (MWN_MISMATCHED_NOTIFY)
此方法呼叫Object.notify()或Object.notifyAll()而沒有獲取到該物件的物件鎖。呼叫notify()或notifyAll()而沒有持有該物件的物件鎖,將導致IllegalMonitorStateException異常。
16.MWN: Mismatched wait() (MWN_MISMATCHED_WAIT)
此方法呼叫Object.wait()而沒有獲取到該物件的物件鎖。呼叫wait()而沒有持有該物件的物件鎖,將導致IllegalMonitorStateException異常。
17.NP: Synchronize and null check on the same field. (NP_SYNC_AND_NULL_CHECK_FIELD)
如果程式碼塊是同步的,那麼久不可能為空。如果是空,同步時就會丟擲NullPointerException異常。最好是在另一個程式碼塊中進行同步。
18.No: Using notify() rather than notifyAll() (NO_NOTIFY_NOT_NOTIFYALL)
呼叫notify()而不是notifyAll()方法。 Java的監控器通常用於多個條件。呼叫notify()只喚醒一個執行緒,這意味著該執行緒被喚醒只是滿足的當前的唯一條件。
19.RS: Class's readObject() method is synchronized (RS_READOBJECT_SYNC)
序列化類中定義了同步的readObject()。通過定義,反序列化建立的物件只有一個執行緒可以訪問,因此沒有必要的readObject()進行同步。如果的readObject()方法本身造成物件對另一個執行緒可見,那麼這本身就是不好的編碼方式。
20.Ru: Invokes run on a thread (did you mean to start it instead?) (RU_INVOKE_RUN)
這種方法顯式呼叫一個物件的run()。一般來說,類是實現Runnable介面的,因為在一個新的執行緒他們將有自己的run()方法,在這種情況下Thread.start()方法呼叫是正確的。
21.SC: Constructor invokes Thread.start() (SC_START_IN_CTOR)
在建構函式中啟動一個執行緒。如果類曾經被子類擴充套件過,那麼這很可能是錯的,因為執行緒將在子類構造之前開始啟動。
22.SP: Method spins on field (SP_SPIN_ON_FIELD)
方法無限迴圈讀取一個欄位。編譯器可合法懸掛宣讀迴圈,變成一個無限迴圈的程式碼。這個類應該改變,所以使用適當的同步(包括等待和通知要求)
23.STCAL: Call to static Calendar (STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE)
即使JavaDoc對此不包含暗示,而Calendars本身在多執行緒中使用就是不安全的。探測器發現當呼叫Calendars的例項時將會獲得一個靜態物件。
Calendar rightNow = Calendar.getInstance();
24.STCAL: Call to static DateFormat (STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE)
在官方的JavaDoc,DateFormats多執行緒使用本事就是不安全的。探測器發現呼叫一個DateFormat的例項將會獲得一個靜態物件。
myString = DateFormat.getDateInstance().format(myDate);


25.STCAL: Static Calendar (STCAL_STATIC_CALENDAR_INSTANCE)
Calendar在多執行緒中本身就是不安全的,如果線上程範圍中共享一個Calendarde 例項而不使用一個同步的方法在應用中就會出現一些奇怪的行為。在sun.util.calendar.BaseCalendar.getCalendarDateFromFixedDate()中會丟擲ArrayIndexOutOfBoundsExceptions or IndexOutOfBoundsExceptions異常。
26.STCAL: Static DateFormat (STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE)
DateFormat 在多執行緒中本身就是不安全的,如果線上程範圍中共享一個DateFormat的例項而不使用一個同步的方法在應用中就會出現一些奇怪的行為。
27.SWL: Method calls Thread.sleep() with a lock held (SWL_SLEEP_WITH_LOCK_HELD)
當持有物件時呼叫Thread.sleep()。這可能會導致很差的效能和可擴充套件性,或陷入死鎖,因為其他執行緒可能正在等待獲得鎖。呼叫wait()是一個更好的主意,釋放物件的持有以允許其他執行緒執行。
28.UG: Unsynchronized get method, synchronized set method (UG_SYNC_SET_UNSYNC_GET)
這個類包含類似命名的get和set方法。在set方法是同步方法和get方法是非同步方法。這可能會導致在執行時的不正確行為,因為呼叫的get方法不一定返回物件一致狀態。 GET方法應該同步。
29.UL: Method does not release lock on all paths (UL_UNRELEASED_LOCK)
方法獲得了當前的物件所,但是在方法中始終沒有釋放它。一個正確的示例如下:
  Lock l = ...;
    l.lock();
    try {
        // do something
    } finally {
        l.unlock();
    }
30.UL: Method does not release lock on all exception paths (UL_UNRELEASED_LOCK_EXCEPTION_PATH)
方法獲得了當前的物件所,但是在所有的異常處理中始終沒有釋放它。一個正確的示例如下:
  Lock l = ...;
    l.lock();
    try {
        // do something
    } finally {
        l.unlock();
    }
31.UW: Unconditional wait (UW_UNCOND_WAIT)
方法中包含呼叫java.lang.Object.wait(),而卻沒有放到條件流程控制中。該程式碼應確認條件尚未滿足之前等待;先前任何通知將被忽略。
32.VO: A volatile reference to an array doesn't treat the array elements as volatile (VO_VOLATILE_REFERENCE_TO_ARRAY)
宣告一個變數引用陣列,這可能不是你想要的。如果一個變數引用陣列,那麼對引用陣列的讀和寫都是不安全的,但是陣列元素不是變數。取得陣列的變數值你可以使用java.util.concurrent包中的陣列的原子性特性
33.WL: Sychronization on getClass rather than class literal (WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL)
例項的方法中同步this.getClass(),如果這個類有子類集合,那麼子類集合中的物件將會在這個類的各個子類上進行同步,這不是我們想要的效果,我們只要同步當前的類物件而不包含它的所有子類,可以同步類名.getClass()。例如,java.awt.Label的程式碼:
     private static final String base = "label";
     private static int nameCounter = 0;
     String constructComponentName() {
        synchronized (getClass()) {
            return base + nameCounter++;
        }
     }
Label中的子類集合不可能在同一個子物件上進行同步,替換上面的方法為:
    private static final String base = "label";
     private static int nameCounter = 0;
     String constructComponentName() {
        synchronized (Label.class) {
            return base + nameCounter++;
        }
     }
34.WS: Class's writeObject() method is synchronized but nothing else is (WS_WRITEOBJECT_SYNC)
這個類有一個writeObject()方法是同步的,但是這個類中沒有其他的同步方法。
35.Wa: Condition.await() not in loop (WA_AWAIT_NOT_IN_LOOP)
方法沒有在迴圈中呼叫java.util.concurrent.await()。如果物件是用於多種條件,打算呼叫wait()方法的條件可能不是實際發生的。
36.Wa: Wait not in loop (WA_NOT_IN_LOOP)
這種方法包含呼叫java.lang.Object.wait(),而這並不是一個迴圈。如果監視器用於多個條件,打算呼叫wait()方法的條件可能不是實際發生的。
八:Malicious codevulnerability關於惡意破壞程式碼相關方面的
1.EI: May expose internal representation by returning reference to mutable object (EI_EXPOSE_REP)
返回一個易變物件引用並把它儲存在物件欄位中時會暴露物件內部的欄位描述,如果接受不守信任的程式碼訪問或者沒有檢查就去改變易變物件的會涉及物件的安全和其他重要屬性的安全。返回一個物件的新副本,在很多情況下更好的辦法。
2.EI2: May expose internal representation by incorporating reference to mutable object (EI_EXPOSE_REP2)
此程式碼把外部可變物件引用儲存到物件的內部表示。如果例項受到不信任的程式碼的訪問和沒有檢查的變化危及物件和重要屬性的安全。儲存一個物件的副本,在很多情況下是更好的辦法。
3.FI: Finalizer should be protected, not public (FI_PUBLIC_SHOULD_BE_PROTECTED)
一個類中的finalize()方法必須宣告為protected,而不能為public型別
4.MS: Public static method may expose internal representation by returning array (MS_EXPOSE_REP)
一個public型別的靜態方法返回一個數組,可能引用內部屬性的暴露。任何程式碼呼叫此方法都可以自由修改底層陣列。一個解決辦法是返回一個數組的副本。
5.MS: Field should be both final and package protected (MS_FINAL_PKGPROTECT)
一個靜態欄位可能被惡意程式碼或另外一個包所改變的。欄位可以放到protected包中也可以定義為final型別的以避免此問題。
6.MS: Field is a mutable array (MS_MUTABLE_ARRAY)
一個定義為final型別的靜態欄位引用一個數組時它可以被惡意程式碼或在另其他包中所使用。這些程式碼可以自由修改陣列的內容。
7.MS: Field is a mutable Hashtable (MS_MUTABLE_HASHTABLE)
一個定義為final型別的靜態欄位引用一個Hashtable時可以被惡意程式碼或者在其他包中被呼叫,這些方法可以修改Hashtable的值。
8.MS: Field should be moved out of an interface and made package protected (MS_OOI_PKGPROTECT)
將域儘量不要定義在介面中,並宣告為包保護
在介面中定義了一個final型別的靜態欄位,如陣列或雜湊表等易變物件。這些物件可以被惡意程式碼或者在其他包中被呼叫,為了解決這個問題,需要把它定義到一個具體的實體類中並且宣告為保護型別以避免這種錯誤。
9.MS: Field should be package protected (MS_PKGPROTECT)
一個靜態欄位是可以改變的惡意程式碼或其他的包訪問修改。可以把這種型別的欄位宣告為final型別的以防止這種錯誤。
十:Dodgy關於程式碼執行期安全方面的
1.XSS: Servlet reflected cross site scripting vulnerability (XSS_REQUEST_PARAMETER_TO_SEND_ERROR)
在程式碼中在Servlet輸出中直接寫入一個HTTP引數,這會造成一個跨站點的指令碼漏洞。
2.XSS: Servlet reflected cross site scripting vulnerability (XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER)
程式碼直接寫入引數的HTTP伺服器錯誤頁(使用HttpServletResponse.sendError)。表達了類似的不受信任的輸入會引起跨站點指令碼漏洞。
3.BC: Questionable cast to abstract collection (BC_BAD_CAST_TO_ABSTRACT_COLLECTION)
在程式碼投把一個集合強制型別轉換為一個抽象的集合(如list,set或map)。保證該物件型別和將要轉換的型別是一致的。如果你只是想要便利一個集合,那麼你就不必將它轉換為Set或List。
4.BC: Questionable cast to concrete collection (BC_BAD_CAST_TO_CONCRETE_COLLECTION)
程式碼把抽象的集合(如List,Set,或Collection)強制轉換為具體落實型別(如一個ArrayList或HashSet)。這可能不正確,也可能使您的程式碼很脆弱,因為它使得難以在今後的切換指向其他具體實現。除非你有特別理由這樣做,否則只需要使用抽象的集合類。
5.BC: Unchecked/unconfirmed cast (BC_UNCONFIRMED_CAST)
強制型別轉換操作沒有經過驗證,而且不是所有的此種類型裝換過的類都可以再強制型別轉換為原型別。在程式碼中需要進行邏輯判斷以保證可以進行這樣的操作。
6.BC: instanceof will always return true (BC_VACUOUS_INSTANCEOF)
instanceof測試將始終返回真(除非被測試的值為空)。雖然這是安全,確保它是不是說明一些誤解或其他一些邏輯錯誤。如果你真的想測試是空的價值,也許會更清楚這樣做的更好空試驗,而不是一個instanceof測試。
7.BSHIFT: Unsigned right shift cast to short/byte (ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT)
無符號數右移後進行轉換為short或者byte型別時可能會丟棄掉高位的值,這樣的結果就是有符合數和無符號數無法區分(這取決於移位大小)
8.CI: Class is final but declares protected field (CI_CONFUSED_INHERITANCE)
這個類被宣告為final的,而是欄位屬性卻宣告為保護型別的。由於是final類,它不能再被繼承,而再宣告為保護型別的很容易造成混淆。為了從外部能正確的使用它應該把它們宣告為private或者public型別。
9.DB: Method uses the same code for two branches (DB_DUPLICATE_BRANCHES)
此方法使用相同的程式碼,以實現兩個有條件的分支。檢查以確保這是不是一個編碼錯誤。
10.DB: Method uses the same code for two switch clauses (DB_DUPLICATE_SWITCH_CLAUSES)
他的方法使用相同的程式碼來實現兩個switch的宣告條款。這可能是重複程式碼的情況,但可能也顯示出編碼的錯誤。
11.DLS: Dead store to local variable (DLS_DEAD_LOCAL_STORE)
該指令為區域性變數賦值,但在其後的沒有對她做任何使用。通常,這表明一個錯誤,因為值從未使用過。
12.DLS: Useless assignment in return statement (DLS_DEAD_LOCAL_STORE_IN_RETURN)
本宣告把一個區域性變數放到方法的返回語句中。這對於方法中區域性變數來說是沒有意思的。
13.DLS: Dead store of null to local variable (DLS_DEAD_LOCAL_STORE_OF_NULL)
把一個本地變數賦值為null值,並且再也沒有對這個變數做任何的操作。這樣可能是為了垃圾回收,而是Java SE 6.0,這已不再需要。
14.DMI: Code contains a hard coded reference to an absolute pathname (DMI_HARDCODED_ABSOLUTE_FILENAME)
此程式碼包含檔案物件為一個絕對路徑名(例如,新的檔案(“/ home/dannyc/workspace/j2ee/src/share/com/sun/enterprise/deployment”);
15.DMI: Non serializable object written to ObjectOutput (DMI_NONSERIALIZABLE_OBJECT_WRITTEN)
程式碼中讓一個非序列化的物件出現在ObjectOutput.writeObject()方法中,這樣會引起一個錯誤。
16.DMI: Invocation of substring(0), which returns the original value (DMI_USELESS_SUBSTRING)
此程式碼呼叫了subString(0)方法,它將返回原來的值。
17.Eq: Class doesn't override equals in superclass (EQ_DOESNT_OVERRIDE_EQUALS)
子類定義了一個新的equals方法但是卻不是覆寫了父類本省的equals()方法。
18.FE: Test for floating point equality (FE_FLOATING_POINT_EQUALITY)
此操作比較兩個浮點值是否相等。由於浮點運算可能會涉及到舍入,計算float和double值可能不準確。如果要求值必須準確,如貨幣值,可以考慮使用固定精度型別,如BigDecimal型別的值來比較
19.FS: Non-Boolean argument formatted using %b format specifier (VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN)
使用%b去格式化Boolean型別的值不正確的但是它不會丟擲異常,任何非空的值都會輸出true,任何為空的值都會輸出false
20.IC: Initialization circularity (IC_INIT_CIRCULARITY)
在引用兩個相互呼叫為環狀static方法去初始化一個例項時是錯誤的。
21.ICAST: integral division result cast to double or float (ICAST_IDIV_CAST_TO_DOUBLE)
整形數除法強制轉換為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;
22.ICAST: Result of integer multiplication cast to long (ICAST_INTEGER_MULTIPLY_CAST_TO_LONG)
整形數做乘法運算結果轉換為long值時如果採用
long convertDaysToMilliseconds(int days) { return 1000*3600*24*days; } 結果會因為超出整形的範圍而出錯。
如果使用:
long convertDaysToMilliseconds(int days) { return 1000L*3600*24*days; }
或者:
static final long MILLISECONDS_PER_DAY = 24L*3600*1000;
 long convertDaysToMilliseconds(int days) { return days * MILLISECONDS_PER_DAY; }
都可以避免此問題。
23.IM: Computation of average could overflow (IM_AVERAGE_COMPUTATION_COULD_OVERFLOW)
程式碼中使用x % 2 == 1的方法去驗證運算是否存在餘數的情況,但是如果出現負數的情況就不起作用了。使用x & 1 == 1, or x % 2 != 0來代替
24.INT: Vacuous comparison of integer value (INT_VACUOUS_COMPARISON)
整形數進行比較結果總是不變。例如:x <= Integer.MAX_VALUE
25.MTIA: Class extends Servlet class and uses instance variables (MTIA_SUSPECT_SERVLET_INSTANCE_FIELD)
這個類擴充套件從Servlet類,並使用例項的成員變數。由於只有一個Servlet類的例項,並在多執行緒方式使用,這種模式有可能存在問題。考慮只使用方法的區域性變數。
26.MTIA: Class extends Struts Action class and uses instance variables (MTIA_SUSPECT_STRUTS_INSTANCE_FIELD)
類擴充套件自Struts的Action類並使用這個例項的成員變數,因為在Struts框架中只存在一個Action例項物件並且使用在多執行緒的情況下很可能會出現問題。
27.NP: Dereference of the result of readLine() without nullcheck (NP_DEREFERENCE_OF_READLINE_VALUE)
對readLine()的結果值沒有進行判空操作就去重新賦值,這樣的操作可以會丟擲空指標異常。
28.NP: Immediate dereference of the result of readLine() (NP_IMMEDIATE_DEREFERENCE_OF_READLINE)
對readLine()的結果立即賦值,這樣的操作可以會丟擲空指標異常。
29.NP: Possible null pointer dereference due to return value of called method (NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE)
方法的返回值沒有進行是否為空的檢查就重新賦值,這樣可能會出現空指標異常。
30.NP: Parameter must be nonnull but is marked as nullable (NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE)
引數值在任何情況下都不能為空,但是有明確的註釋它可以為空。
31.NS: Potentially dangerous use of non-short-circuit logic (NS_DANGEROUS_NON_SHORT_CIRCUIT)
程式碼中使用(& or |)代替(&& or ||)操作,這會造成潛在的危險。
32.NS: Questionable use of non-short-circuit logic (NS_NON_SHORT_CIRCUIT)
程式碼中使用(& or |)代替(&& or ||)操作,會引起不安全的操作
33.PZLA: Consider returning a zero length array rather than null (PZLA_PREFER_ZERO_LENGTH_ARRAYS)
考慮返回一個零長度的陣列,而不是null值
34.QF: Complicated, subtle or wrong increment in for-loop (QF_QUESTIONABLE_FOR_LOOP)
確定這個迴圈是正確的變數遞增,看起來,另一個變數被初始化,檢查的迴圈。這是由於for迴圈中太複雜的定義造成的。
35.RCN: Redundant comparison of non-null value to null (RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE)
方法中包含一個不能為空的賦值還包含一個可以為空的賦值。冗餘比較非空值為空。
36.RCN: Redundant comparison of two null values (RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES)
方法中對兩個null值進行比較
37.RCN: Redundant nullcheck of value known to be non-null (RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE)
方法中對不為空的值進行為空的判斷。
38.REC: Exception is caught when Exception is not thrown (REC_CATCH_EXCEPTION)
在try/catch塊中捕獲異常,但是異常沒有在try語句中丟擲而RuntimeException又沒有明確的被捕獲
39.RI: Class implements same interface as superclass (RI_REDUNDANT_INTERFACES)
子類和父類都實現了同一個介面,這種定義是多餘的。
40.RV: Method discards result of readLine after checking if it is nonnull (RV_DONT_JUST_NULL_CHECK_READLINE)
readLine方法的結果不為空時被拋棄
41.RV: Remainder of 32-bit signed random integer (RV_REM_OF_RANDOM_INT)
此程式碼生成一個隨機的符號整數,然後計算另一個值的。由於隨機數可以是負數,所以其餘操作的結果也可以是負面的。考慮使用Random.nextInt(int)方法代替。
42.SA: Double assignment of local variable (SA_LOCAL_DOUBLE_ASSIGNMENT)
為一個區域性變數兩次賦值,這樣是沒有意義的。例如:
public void foo() {
    int x,y;
    x = x = 17;
  }
43.SA: Self assignment of local variable (SA_LOCAL_SELF_ASSIGNMENT)
區域性變數使用自身給自己賦值
public void foo() {
    int x = 3;
    x = x;
  }
44.SF: Switch statement found where one case falls through to the next case (SF_SWITCH_FALLTHROUGH)
Switch語句中一個分支執行後又執行了下一個分支。通常case後面要跟break 或者return語句來跳出。
45.SF: Switch statement found where default case is missing (SF_SWITCH_NO_DEFAULT)
Switch沒有預設情況下執行的case語句。
46.Se: private readResolve method not inherited by subclasses (SE_PRIVATE_READ_RESOLVE_NOT_INHERITED)
宣告為private的序列化方法被子類繼承
47.UCF: Useless control flow (UCF_USELESS_CONTROL_FLOW)
沒有任何作用的條件語句。
if (argv.length == 0) {
 // TODO: handle this case
 }
48.UCF: Useless control flow to next line (UCF_USELESS_CONTROL_FLOW_NEXT_LINE)
無效的條件控制語句,注意if (argv.length == 1);以“;”結尾,下面的語句無論是否滿足都會執行。
if (argv.length == 1);
        System.out.println("Hello, " + argv[0]);
49.UwF: Field not initialized in constructor (UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR)
欄位從來沒有在任何建構函式初始化,物件被建立後值為空。如果該欄位未被定義就重新賦值會產生一個空指標異常。
50.XFB: Method directly allocates a specific implementation of xml interfaces (XFB_XML_FACTORY_BYPASS)
方法自定義了一種XML介面的實現類。最好是使用官方提供的工廠類來建立這些物件,以便可以在執行期中改變。例如:
javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.SAXParserFactory
javax.xml.transform.TransformerFactory
org.w3c.dom.Document.createXXXX