5分でわかる静的解析入門

21
5分でわかる静的解析入門 Learn PHP static analysis in 5 min. 2016-07-20 PHP BLT #5

Transcript of 5分でわかる静的解析入門

Page 1: 5分でわかる静的解析入門

5分でわかる静的解析入門Learn PHP static analysis in 5 min.

2016-07-20 PHP BLT #5

Page 2: 5分でわかる静的解析入門

お前誰よ

• うさみけんた (@tadsan) / Zonu.EXE

• GitHub/Packagistでは id:zonuexe

• Ruby書いてたら、何の因果かPHPを書く仕事に

• 好きな言葉はメタプログラミングです

Page 3: 5分でわかる静的解析入門

さて

Page 4: 5分でわかる静的解析入門

敵を知れば百戦殆ふからず

• プログラムを実際に動かさずして、ソフトウェアの性質を把握する

• いろんなツールとか手法がある

• 人間がPull Requestのdiffを見てレビューするのも一種の静的解析

• ユニットテストは実際に動かすので動的検査の一種

Page 5: 5分でわかる静的解析入門

wc -l **/*.php

Page 6: 5分でわかる静的解析入門

wc -l **/*.php

• Unixの標準コマンド

• お前は何を言ってるんだ

• ファイルの行数を測る (-l)

• バイト数を測る (-c)

Page 7: 5分でわかる静的解析入門

php -l a.php

Page 8: 5分でわかる静的解析入門

php -l target.php

• コードがSyntax Errorではないか検査する

• 実際に運用されるサーバーと同じバージョンを利用する

• git ls-files | grep '\.php$' | xargs -IFILE -n1 php -l FILE

Page 9: 5分でわかる静的解析入門

token_get_all()

Page 10: 5分でわかる静的解析入門

token_get_all()

• PHPの標準関数 (要tokenizer)

• スクリプトを構文要素ごとに切り分けてくれる(だけ)

• 構文解析はしてくれない… (重要)

• 目的を集中すれば小さなパーサーは意外に書けた

Page 11: 5分でわかる静的解析入門

preg_match()

Page 12: 5分でわかる静的解析入門

preg_match()

• PHPの標準関数(最終兵器)

• 雑な正規表現でも意外と機能する

• 正規表現パターンなら誰でも書けるので、チームでメンテナンスできる

Page 13: 5分でわかる静的解析入門

preg_match()

• こんな感じで配列にパターンを並べていく

[ 'level' => 'error', 'desc' => 'mt_srand() は使用禁止', 'pattern' => [ '/[^a-zA-Z0-9_$:>]mt_srand *\(/i' => false, ], ],

Page 14: 5分でわかる静的解析入門

そのほか

Page 15: 5分でわかる静的解析入門

よのなかにはたくさん実装ある

• PHPの静的解析 — Algo13 2016.04.11 ドキュメント http://algo13.net/php/tips/static-analysis.html

• ↑良い感じにまとまってるネ申記事

• phpmd, phpcs, php7cc…

• 簡単な構文解析のサンプル載ってる

Page 16: 5分でわかる静的解析入門

何をしたいのか

Page 17: 5分でわかる静的解析入門

静的解析できると何が嬉しいのか

• Syntax Errorなファイルをデプロイしないようにしたい…

• 弊社でも昔はありました

• コードレビューでつまらないことを指摘したくない

• 割と膨大なコードを安全にPHP7に着地させたい

Page 18: 5分でわかる静的解析入門

最近のナウいツール

Page 19: 5分でわかる静的解析入門

etsy/phan

• Rasmus Lerdorfを要するEtsy社が開発する静的解析ツール

• 未定義関数とか型がをかしいとか、とにかくいろんな指摘してくれる

• PHPDocの型を解析してくれる

• 日本語で紹介すればバズれるぞ!!!

Page 20: 5分でわかる静的解析入門

最近やってること

Page 21: 5分でわかる静的解析入門

baguette/definfo

• 最近夜な夜な作ってるツール

• 実行時情報(Reflection)を使っていろいろ指図してくれるようにするつもり

• タグジャンプの代替にしたい

• 静的解析はしないつもりだったけど、どうにもならないところはがんばって構文解析してる