莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          Clojure世界:靜態代碼分析

          Posted on 2012-03-23 21:28 dennis 閱讀(4576) 評論(0)  編輯  收藏 所屬分類: 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),后面的與此類似。理論上你也可以自定義規則,并提交給官方??傮w上說kibit仍然是比不上findbugs的,期待未來發展的更好。
          主站蜘蛛池模板: 华蓥市| 花莲市| 延吉市| 陇川县| 灵川县| 靖安县| 外汇| 白玉县| 滦南县| 武胜县| 阿拉尔市| 临沂市| 宜州市| 唐海县| 扬中市| 浦县| 长沙县| 大厂| 吴堡县| 且末县| 万荣县| 繁峙县| 邢台市| 循化| 乌兰县| 白河县| 醴陵市| 沙河市| 泸州市| 缙云县| 元江| 衡南县| 科尔| 临海市| 丹寨县| 娄烦县| 广州市| 大埔区| 伊金霍洛旗| 西安市| 张北县|