閱讀693 返回首頁    go 魔獸


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#))

    顯然,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)])

   
    第一個規則,任何對類似(+ 1 x)的代碼,都建議替換成(inc x),後麵的與此類似。理論上你也可以自定義規則,並提交給官方。總體上說kibit仍然是比不上findbugs的,期待未來發展的更好。


文章轉自莊周夢蝶  ,原文發布時間 2012-03-23

最後更新:2017-05-18 20:36:29

  上一篇:go  淘寶開源MQ——metaq的詳細文檔
  下一篇:go  Clojure世界:如何做性能測試