簡單來說,JLint是一個可以幫你分析你寫的Java程式碼的工具,包括語法(syntax)及語義(semantic)檢查,不一致性及同步問題等。其中AntiC.exe是負責語法檢查,JLint.exe是負責語義檢查。
快速入門(如果你只想知道如何用)
- 下載:到JLint官方網站下載(http://artho.com/jlint/download.shtml),我是下載Windows版 jlint-2.3.zip。
- 解壓縮:將jlint-2.3.zip解壓縮。如果你只是要使用JLint來檢查Java程式碼,你需要用到 jlint-2.3\jlintwin32\中的兩個執行檔(antic.exe和jlint.exe)就可以了。
- 語法檢查:antic.exe src\*.java(ex: src為放java檔的folder),執行完antic.exe就可以看到結果輸出。
- 語義檢查:jlint.exe src\*.java(ex: src為放java檔的folder),執行完jlint.exe就可以看到結果輸出。
- AntiC能檢查的是
- 字裡行間的蟲蟲戰爭(Bugs in tokens)
- 跳離符號後數字必須是八進位數字。
- 跳離符號後數字個數必須小於三個字元。
- Unicode的跳離符號\u後接的是十六進位數字。
- 跳離符號接了錯誤的字元(非八進位字元或Unicode)。
- 少用Trigraph sequence(以??為前置字元的三字元序列)為妙。
- 多字元的字元定義(char ch = 'ab';)是不一定可移植的。
- 長整數定義時後置字元最好是大寫的L,小寫l會跟數字1混淆。
- 運算子間的恩怨情仇(Operator priorities)
- 運算子運算時最好有括號表示優先順序。
- AND運算子優先權比OR運算子高。
- 位元位移運算子優先權較低。
- 邏輯中的等於是==而不是=。
- 指定運算子=具較低優先權。
- 位元運算子具較低優先權。
- 程式主體的誰是誰非(Statement body)
- 迴圈中的程式碼最好用括號定義範圍。
- 邏輯IF的程式碼最好用括號定義範圍。
- 邏輯ELSE的程式碼最好用括號定義範圍。
- 條件邏輯SWITCH的程式碼最好用括號定義範圍。
- 條件邏輯中的CASE或DEFAULT的程式碼最好用括號定義範圍。
- 條件邏輯中的CASE或DEFAULT的程式碼不要忘了BREAK。
- 字裡行間的蟲蟲戰爭(Bugs in tokens)
- JLint能檢查的是
- 同步(synchronization)
- 死結(deadlock)
- 競賽情況(Race Condition)
- 繼承(inheritance)
- 派生類別的方法名稱沒有正確覆蓋有相同名稱的基本類別的方法名稱
- 派生類別中的元件名稱與基本類別元件名稱相同 區域變數名稱與元件中全域變數名稱相同
- 方法的finalize()未能Call到super.finalize()
- 資料流程(data flow)
- method的參數傳遞可能有null的情形
- 變數的使用可能會有null的情形
- 運算元可能會有null的情形,會有method的使用問題
- 零個運算元的運算
- 運算結果都為零
- 位元位移計算超過位數(例如:int y >>= 32, 最多只能shift 31位)
- 位元位移計算超過範圍(例如:int x >>= 32 - (y & 31); // range of count is [1,32])
- 變數值的轉換超出範圍(例如:int x = 100000; short s = x;)
- 變數值的轉換會導致資料遺失(例如:數值範圍較大的變數轉換到數值範圍較小的變數)
- 變數運算後的型態轉換會導致資料遺失(例如:兩個整數相乘)
- 邏輯判斷恆為真(True)或假(False)
- 只有當比較的運算元都為0時,邏輯判斷才會成立
- 餘數運算恆等於第一個運算元
- char與short比較
- 字串比對誤用物件比對
- 不等式的比較可以用等式的比較 替代
- Switch中Case的值超出範圍
沒有留言:
張貼留言