HipHopを使用した静的PHPコード分析

突然、HipHopのPHPの静的コード分析などのすばらしい機能に関する情報がロシア語で見つかりませんでした。そのため、DevConfでのRasmusのプレゼンテーションからアイデアを得たというレビューに会います。



そして、それはどうですか?


静的コード分析は非常に便利です。それ以外の場合は、それを含む関数が呼び出されるまでエラーが表示されないためです。 HipHopはどのようにそれを行いますか? PHPをC ++に変換します!



したがって、一般的に長い間誰も驚かなかったC ++コードを静的に分析し、受信した情報をPHPに(自然に自動的に)適用する機会が得られます。



それでは始めましょう。



環境


テストのために、新しいCentos 5.8 x64サーバーを選択しました

# uname -a Linux TEST 2.6.18-308.8.1.el5xen #1 SMP Tue May 29 15:38:25 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
      
      







HipHopにインストール

 rpm -ivh http://epel.osuosl.org/5/x86_64/epel-release-5-4.noarch.rpm rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/ius-release-1.0-10.ius.el5.noarch.rpm rpm -ivh http://pkg.tag1consulting.com/hphp/x86_64/hphp-release-1.0-2.el5.noarch.rpm yum install hiphop-php -y
      
      







環境変数を追加しました(何らかの理由で、RPM自体は追加しませんでした)

 export HPHP_HOME=/usr/lib64/hphp
      
      







レポート用のフォルダを作成しました
 mkdir /var/reports export SRC_DIR=/var/www/ export OUTPUT_DIR=/var/reports
      
      







これで環境の準備が整い、実験を開始できます。



分析準備




まず、分析するファイルのリストを作成する必要があります。

1つのテストファイルを分析しましたが、プロジェクト全体を一度に確認したい場合は、次の操作を実行できます。

 find $SRC_DIR -name '*.php' > $OUTPUT_DIR/files.txt
      
      







ファイルのリストがコンパイルされたら、次のパラメーターを使用してHipHopにフィードする必要があります。

--target = analyze-HipHopを呼び出した理由

--input-list = $ OUTPUT_DIR / files.txt-チェックするファイルのリスト

--input-dir = $ SRC_DIR-チェックが必要なファイルはどこですか?

--output-dir = $ OUTPUT_DIR-テスト結果を保存する場所

--gen-stats = 1-統計エラー情報を含むファイルを作成します

--log = 3-コンソールに表示されるログのレベル(3-最適)

--force = 1-見つかったエラーを無視して分析を続行します

--parse-on-demand = 0-リストにないファイルに触れないでください



分析


行こう!

 $HPHP_HOME/src/hphp/hphp --input-list=$OUTPUT_DIR/files.txt --input-dir=$SRC_DIR --output-dir=$OUTPUT_DIR --gen-stats=1 --log=3 --force=1 --parse-on-demand=0 --target=analyze
      
      







ところで、解析中に"Unable to parse file: /var/www/user.php\n (Line: 14, Char: 23):



ようなエラーが表示された場合"Unable to parse file: /var/www/user.php\n (Line: 14, Char: 23):





これは、ファイルに構文エラーがあり、まったく機能しないことを意味するため、注意してください!



分析結果




hphpが作業を完了すると(そしてこれは驚くほど高速に発生します!)、/ var / reports /フォルダーに2つのファイルが表示されます。

CodeError.jsおよびStats.js



後者の内容は次のように解読されます:

 Array ( [FileCount] => 125 [LineCount] => 11784 [CharCount] => 433255 [FunctionCount] => 350 [ClassCount] => 17 [TotalTime] => 0 [AvgCharPerLine] => 36 [AvgLinePerFunc] => 33 [SymbolTypes] => Array ( [Array] => 64 [Boolean] => 43 [Double] => 30 [Int32] => 68 [Int64] => 2208 [Numeric] => 23 [Object] => 11 [Object - Specific] => 58 [Primitive] => 31 [Sequence] => 2 [String] => 221 [Variant] => 1458 [_all] => 4217 [_strong] => 2703 [_weak] => 1514 ) [VariableTableFunctions] => Array ( ) )
      
      





私の意見では、すべてが明確であり、説明するものは何もありません。



ただし、 CodeError.jsをより詳細に検討する必要があります。

JSON形式でもあり、HipHopが検出したすべてのエラーに関する情報が含まれています。

そして彼は次のタイプの故障を探しています。







ファイル内のJSONは配列であり、最初の要素に見つかったエラーの数が示され、2番目の要素のリストは実際にはグループでソートされています。



すべてのエラーを読み取り可能な形式で表示するには、Patrick Allaertのスクリプトを使用するか、美しいものを使って何かを書くことができます=)





そのようなひどいファイルがあります

 <?php ini_set('display_errors', 0); require("$a.php"); define('CONSTANT', 1); function myfunc($arg1 = 'optional', $arg2) { echo $missing_var; } define('CONSTANT', 1);
      
      







テストを実行して、エラーを確認してください

 ./CodeErrorFormatter.php /var/report/CodeError.js
      
      







申し訳ありませんが、私のPHPはgetoptエラーを返しましたが、ペンでファイルパスを入力すると、次の出力が得られました。

CodeErrorFormatter 1.1.0 by Patrick Allaert.



UseUndeclaredVariable

================================================================================



/var/www/index.php

9:9 -> 9:21 details: $missing_var

4:9 -> 4:11 details: $a

DeclaredConstantTwice

================================================================================



/var/www/index.php

12:0 -> 12:21 details: define('CONSTANT', 1)

RequiredAfterOptionalParam

================================================================================



/var/www/index.php

8:16 -> 8:41 details: $arg2









ご覧のとおり、エラーごとに、タイプ、ファイルアドレス、一致しない関数/変数の名前、その行とファイル内の位置がここに示されています。 それらを使って次に何をすべきか-自分で考えてください(自動バグレポートか、自分で修正するか、他の何か)。



おわりに


一般に、静的分析のトピックはPHPにとって新しいものではありませんが、このテーマに関するロシア語の記事はほとんどなく 、HipHopに影響するものはありません。



みんなに使ってみてください。 もちろん、これは「銀の弾丸」であると考えるべきではありませんが、分析では、人が捕まえるのが非常に難しいことを示しています。



このレビューが誰かに役立つことを願っていますか、それとも誰かがブラウザからコードを美しくテストするためにビジュアルを書くことでしょうか?



=====================



Facebook HipHopプロジェクト

CodeError.js CodeFormatter

DevConf 2012でのRasmus Lerdorfのプレゼンテーションtalks.php.net/show/devconf/-必見!



All Articles