693
魔獸
Clojure世界:靜態代碼分析
Java世界裏有findbugs這樣的神器,可以讓你避免很多“簡單愚蠢”的bug。同樣,Clojure世界裏也有相應的替代品,這就是今天要介紹的kibit。不過kibit現在還比較年輕,判斷的規則較少,但是已經可以使用起來做clojure代碼的靜態檢查。項目主頁:https://github.com/jonase/kibit
使用:
1.安裝lein插件:
lein plugin install jonase/kibit 0.0.2
2.在項目的根目錄運行
lein kibit
kibit會分析項目裏所有clojure源碼,每個namespace分別分析,例如我分析clojure-control的輸出:
== control.commands ==
== control.core ==
[186] Consider (zero? (:status (ssh host user cluster (str "test -e " file)))) instead of (= (:status (ssh host user cluster (str "test -e " file))) 0)
== control.main ==
== leiningen.control ==
[null] Consider Integer/parseInt instead of (fn* [p1__61444#] (Integer/parseInt p1__61444#))
[null] Consider Integer/parseInt instead of (fn* [p1__65254#] (Integer/parseInt p1__65254#))
== control.core ==
[186] Consider (zero? (:status (ssh host user cluster (str "test -e " file)))) instead of (= (:status (ssh host user cluster (str "test -e " file))) 0)
== control.main ==
== leiningen.control ==
[null] Consider Integer/parseInt instead of (fn* [p1__61444#] (Integer/parseInt p1__61444#))
[null] Consider Integer/parseInt instead of (fn* [p1__65254#] (Integer/parseInt p1__65254#))
顯然,kibit一個一個namespace分析過去,並且按照規則對它認為有問題的地方打印出來,並提出建議。例如這裏它建議我用
(zero? (:status (ssh host user cluster (str "test -e " file))))
替換control.core裏186行的:
(= (:status (ssh host user cluster (str "test -e " file))) 0)
目前kibit大多數是這類代碼風格上的檢查,還沒有做到類似findbugs那樣更豐富的檢查,例如NPE異常檢查等。此外kibit還提供反射檢查,任何有反射調用的地方都給出警告。
kibit是基於core.logic實現的,它的規則都放在了這裏,通過defrules宏來定義檢查規則,源碼中對算術運算的規則定義:
(defrules rules
[(+ ?x 1) (inc ?x)]
[(+ 1 ?x) (inc ?x)]
[(- ?x 1) (dec ?x)]
[(* ?x (* . ?xs)) (* ?x . ?xs)]
[(+ ?x (+ . ?xs)) (+ ?x . ?xs)])
[(+ ?x 1) (inc ?x)]
[(+ 1 ?x) (inc ?x)]
[(- ?x 1) (dec ?x)]
[(* ?x (* . ?xs)) (* ?x . ?xs)]
[(+ ?x (+ . ?xs)) (+ ?x . ?xs)])
第一個規則,任何對類似(+ 1 x)的代碼,都建議替換成(inc x),後麵的與此類似。理論上你也可以自定義規則,並提交給官方。總體上說kibit仍然是比不上findbugs的,期待未來發展的更好。
文章轉自莊周夢蝶 ,原文發布時間 2012-03-23
最後更新:2017-05-18 20:36:29