PHP 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)を使って

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

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

  • 静的解析はしないつもりだったけど、

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