読者です 読者をやめる 読者になる 読者になる

pfffを試す

OCaml Development

github上のfacebookレポジトリで最近活発に開発されている印象があるので気になっていたツール。

pfff is mainly an OCaml API to write static analysis, dynamic analysis, code visualizations, code navigations, or style-preserving source-to-source transformations such as refactorings on source code.

https://github.com/facebook/pfff

ということでコード解析ツールらしい。が、ビジュアル化と言われて、これを見ても何に役に立つか分からなかった…

実際に動かしてみるとイメージがわくかと思って試してみた。OCaml 3.11以上が必要なのでCentOSだとちょっと大変だが、ここをクリアすれば、

$ git clone git://github.com/facebook/pfff.git
$ cd pfff
$ ./configure
$ make depend
$ make
$ make opt

でOK。

いまのところ実際に使えそうと思ったのは、以下の3つだけかなぁ。この3つはWikiに開発の動機が書かれているので想定利用ケースが分かりやすい。

試しにSymfony1.4のソースコードにscheckをかけると次のような出力になった。

% ./scheck ~/symfony
(ONCE) Eval: TODO
warning: parsing problem in /home/perezvon/symfony/lib/plugins/sfDoctrinePlugin/data/generator/sfDoctrineModule/admin/skeleton/actions/actions.class.php
(ONCE) Use -parse_php to diagnose
...(省略)...
/home/perezvon/symfony/lib/exception/sfException.class.php:208:4: CHECK: unused Local variable $settingsTable
/home/perezvon/symfony/lib/helper/PartialHelper.php:311:10: CHECK: unused Local variable $v
/home/perezvon/symfony/lib/helper/TextHelper.php:88:6: CHECK: unused Local variable $pattern
/home/perezvon/symfony/lib/helper/TextHelper.php:89:6: CHECK: unused Local variable $replacement
/home/perezvon/symfony/lib/i18n/Gettext/MO.php:174:16: CHECK: unused Local variable $magic
/home/perezvon/symfony/lib/i18n/extract/sfI18nPhpExtractor.class.php:32:4: CHECK: unused Local variable $line
top 10 most recurring unused variable names
 script -> 198
 event -> 94
 options -> 81
 arguments -> 38
 peerClassname -> 25
 table -> 24
 value -> 24
 key -> 23
 parameters -> 23
 database -> 22
total errors = 5950

もっと単純な例だと、

<?php
echo $spam;

みたいなNOTICEを発生されるようなPHPソースコードに対してscheckをかけると、

% ./scheck ~/notice.php
/home/perezvon/notice.php:2:5: CHECK: use of undefined variable $spam
top 10 most recurring unused variable names
total errors = 1

のように、ちゃんと未定義の変数の使用を検出してくれた。

ごく単純なミスや怪しいコードのチェックには結構良いかもしれない。