Skip to content

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

公開日:

東京都渋谷区GMO Yours (セルリアンタワー11階)で開催された『PHP BLT #5』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

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

Learn PHP static analysis in 5 min.

2016-07-20 PHP BLT #5

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE
  • GitHub/Packagistでは id:zonuexe
  • Ruby書いてたら、何の因果かPHPを書く仕事に
  • 好きな言葉はメタプログラミングです

Page 3

さて

Page 4

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

  • プログラムを実際に動かさずして、

ソフトウェアの性質を把握する

  • いろんなツールとか手法がある
  • 人間がPull Requestのdiffを見て

レビューするのも一種の静的解析

  • ユニットテストは実際に動かすので

動的検査の一種

Page 5

wc -l **/*.php

Page 6

wc -l **/*.php

  • Unixの標準コマンド
  • お前は何を言ってるんだ
  • ファイルの行数を測る (-l)
  • バイト数を測る (-c)

Page 7

php -l a.php

Page 8

php -l target.php

  • コードがSyntax Errorではないか

検査する

  • 実際に運用されるサーバーと同じ

バージョンを利用する

  • git ls-files | grep '\.php$' |

xargs -IFILE -n1 php -l FILE

Page 9

token_get_all()

Page 10

token_get_all()

  • PHPの標準関数 (要tokenizer)
  • スクリプトを構文要素ごとに

切り分けてくれる(だけ)

  • 構文解析はしてくれない… (重要)
  • 目的を集中すれば小さなパーサーは

意外に書けた

Page 11

preg_match()

Page 12

preg_match()

  • PHPの標準関数(最終兵器)
  • 雑な正規表現でも意外と機能する
  • 正規表現パターンなら誰でも書ける

ので、チームでメンテナンスできる

Page 13

preg_match()

  • こんな感じで配列にパターンを

並べていく

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

Page 14

そのほか

Page 15

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

  • PHPの静的解析 — Algo13 2016.04.11 ドキュメント

http://algo13.net/php/tips/static-analysis.html

  • ↑良い感じにまとまってるネ申記事
  • phpmd, phpcs, php7cc…
  • 簡単な構文解析のサンプル載ってる

Page 16

何をしたいのか

Page 17

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

  • Syntax Errorなファイルを

デプロイしないようにしたい…

  • 弊社でも昔はありました
  • コードレビューでつまらないことを

指摘したくない

  • 割と膨大なコードを安全に

PHP7に着地させたい

Page 18

最近のナウいツール

Page 19

etsy/phan

  • Rasmus Lerdorfを要するEtsy社が

開発する静的解析ツール

  • 未定義関数とか型がをかしいとか、

とにかくいろんな指摘してくれる

  • PHPDocの型を解析してくれる
  • 日本語で紹介すればバズれるぞ!!!

Page 20

最近やってること

Page 21

baguette/definfo

  • 最近夜な夜な作ってるツール
  • 実行時情報(Reflection)を使って

いろいろ指図してくれるようにするつもり

  • タグジャンプの代替にしたい
  • 静的解析はしないつもりだったけど、

どうにもならないところはがんばって構文解析してる