莊周夢蝶

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

          Clojure世界:靜態(tài)代碼分析

          Posted on 2012-03-23 21:28 dennis 閱讀(4576) 評論(0)  編輯  收藏 所屬分類: Clojure
              Java世界里有findbugs這樣的神器,可以讓你避免很多“簡單愚蠢”的bug。同樣,Clojure世界里也有相應(yīng)的替代品,這就是今天要介紹的kibit。不過kibit現(xiàn)在還比較年輕,判斷的規(guī)則較少,但是已經(jīng)可以使用起來做clojure代碼的靜態(tài)檢查。

          項(xiàng)目主頁:https://github.com/jonase/kibit
          使用:
          1.安裝lein插件:
          lein plugin install jonase/kibit 0.0.2

          2.在項(xiàng)目的根目錄運(yùn)行
          lein kibit

          kibit會分析項(xiàng)目里所有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分析過去,并且按照規(guī)則對它認(rèn)為有問題的地方打印出來,并提出建議。例如這里它建議我用
          (zero? (:status (ssh host user cluster (str "test -e " file))))
              替換control.core里186行的:
           (= (:status (ssh host user cluster (str "test -e " file))) 0)

              目前kibit大多數(shù)是這類代碼風(fēng)格上的檢查,還沒有做到類似findbugs那樣更豐富的檢查,例如NPE異常檢查等。此外kibit還提供反射檢查,任何有反射調(diào)用的地方都給出警告。
              kibit是基于core.logic實(shí)現(xiàn)的,它的規(guī)則都放在了這里,通過defrules宏來定義檢查規(guī)則,源碼中對算術(shù)運(yùn)算的規(guī)則定義:
          (defrules rules
            [(+ ?x 1) (inc ?x)]
            [(+ 1 ?x) (inc ?x)]
            [(- ?x 1) (dec ?x)]

            [(* ?x (* . ?xs)) (* ?x . ?xs)]
            [(+ ?x (+ . ?xs)) (+ ?x . ?xs)])
             
              第一個規(guī)則,任何對類似(+ 1 x)的代碼,都建議替換成(inc x),后面的與此類似。理論上你也可以自定義規(guī)則,并提交給官方。總體上說kibit仍然是比不上findbugs的,期待未來發(fā)展的更好。
          主站蜘蛛池模板: 白银市| 福建省| 万山特区| 高清| 五原县| 简阳市| 三河市| 衢州市| 汽车| 张北县| 凌源市| 当阳市| 双峰县| 新郑市| 鹤山市| 虞城县| 平陆县| 额尔古纳市| 安阳县| 平和县| 庄河市| 奇台县| 靖西县| 永嘉县| 阳泉市| 资源县| 清流县| 沧源| 桐柏县| 九龙城区| 庐江县| 洛隆县| 保亭| 镇平县| 蒙自县| 清涧县| 长治市| 汉沽区| 积石山| 裕民县| 连山|