J2EE 最佳作法程式碼複查僅包含一個種類;亦稱為「J2EE 最佳作法」。
程式碼複查中的部分規則需要資料流程分析來偵測一些發現項目。資料流程分析 (Data flow analysis)追蹤往發現項目的路徑。因此當套用這些規則時,會花費較長時間才能完成程式碼複查。
下表列出 J2EE 最佳作法程式碼複查中的所有種類和子種類,以及其內含規則的說明。在左欄中,種類是以粗體文字表示,子種類則為純文字。
種類或子種類 | 說明 |
---|---|
J2EE 最佳作法 | 包含以最佳 J2EE 開發作法為基準規則,並且支援以 WebSphere 伺服器為目標的 Web 專案 |
正確性 | 包含偵測不正確方法呼叫的規則 |
資料競爭 (data race) | 其中包含的規則是用來偵測 J2EE 應用程式中會造成資料競爭狀況的方法呼叫 |
記憶體回收 | 其中包含的規則可偵測會延遲記憶體回收的方法呼叫 |
可維護性 | 其中包含的規則可用來偵測 J2EE 應用程式中難以維護的程式碼 |
效能及可調整性 | 其中包含的規則可用來偵測會妨礙 J2EE 應用程式的效能和限制其可調整性的方法呼叫 |
資源管理 | 包含 J2EE 應用程式中使用資源的 J2EE 最佳作法規則 |
J2EE 最佳作法程式碼複查套用兩種規則類型:快速規則與深度規則。區別規則類型的性質是套用規則花費時間的長短,以及在發現項目中規則呈現資訊的類型。
快速 J2EE 規則
在 J2EE 最佳作法程式碼複查中套用快速 J2EE 規則比深度規則的所需時間少。快速規則呈現與其他程式碼複查相同的發現項目資訊。
深度 J2EE 規則 (deep J2EE rules)
深度 J2EE 規則需要資料流程分析,所以需要比快速規則更長的時間來產生發現項目。深度 J2EE 規則不只會產生發現項目,還會顯示引導至發現項目的路徑。這些規則需要資料流程分析,也就是追蹤發現項目路徑的方法,所以需要比快速規則更長的時間來產生發現項目。深度規則提供下列的其他資訊︰共有 36 個深度 J2EE 規則。下表的左欄列出包含這些規則的子種類。右欄列出或說明子種類中的哪些規則是深度 J2EE 規則。
種類或子種類 | 深度 J2EE 規則 |
---|---|
正確性 | 避免將未實作 java.io.Serializable 的物件儲存在 javax.servlet.http.HttpSession 中 |
資料競爭 (data race) | 避免未使用共用鎖定而指派 javax.servlet.Service.service() 中的任何 static 欄位 避免未使用共用鎖定而指派 javax.servlet.Service.service() 中的 Servlet 實例欄位 |
效能及可調整性 | 在 javax.servlet.http.HttpServletRequest.getSession() 之後,一定要呼叫 javax.servlet.http.HttpSession.invalidate() |
資源管理 | 這個子類別中的所有 32 個規則都是深度 J2EE 規則。 |
本節包含 J2EE 最佳作法程式碼複查中所套用的每一種規則類型的範例。
快速規則範例
下列規則是「效能及可調整性」子種類中的快速規則範例。
避免從任何 Servlet 中呼叫 java.lang.Runtime
深度規則範例
在 new java.io.FileInputStream(java.io.File) 之後,一定要呼叫 java.io.FileInputStream.close()
本節說明 J2EE 最佳作法程式碼複查的已知問題。
誤判的警報 (false positive)︰輸入串流未關閉
摘要︰J2EE 最佳作法程式碼複查產生輸入串流未關閉的發現項目。實際上,並無任何輸入串流可關閉。
public static int readFirstByte(String fileName) { int firstByte = -1; FileInputStream fis=null; BufferedInputStream bis = null; try { fis = new FileInputStream(fileName); bis = new BufferedInputStream(fis); firstByte = bis.read(); } catch (FileNotFoundException fnfe) { LogUtility.log(fnfe); } catch (IOException ioe) { LogUtility.log(ioe); } finally { if (bis!=null){ try { bis.close(); } catch (IOException ioe){ LogUtility.log(ioe); } } } return firstByte; }
暫行解決方法︰用滑鼠右鍵按一下誤判 (false-positive) 的發現項目,再按一下忽略。
不足資訊︰報告 .classpath 檔案的發現項目
摘要︰J2EE 最佳作法程式碼複查產生有關 .classpath 檔案而不是工作台中之資源的發現項目。
說明︰程式碼複查找到二進位類型的問題,而該類型在工作台中沒有對應資源,因為它是包含在外部 JAR 中。
參照︰RFE RATLC00038795
暫行解決方法︰
資源過濾器︰不能用於深度規則
摘要︰您在「資源過濾器」頁面中指定程式碼複查期間不要套用選取的深度規則。但是過濾器沒有發生作用,該規則仍然會套用到您指定的檔案。
說明︰在程式碼複查期間,當深度 J2EE 規則遇到不要套用規則的指定檔案時,其運作方式不同。深度規則不能辨識「資源過濾器」頁面中所指定的檔案,但是可以辨識「已排除」頁面中的檔案,在「已排除」頁面中預設會列出 JAR 檔。這些規則可辨識並排除兩種檔案類型(完整的 Servlet 或 JAR 檔)以及忽略所有的其他檔案類型。