そして、それはどうですか?
静的コード分析は非常に便利です。それ以外の場合は、それを含む関数が呼び出されるまでエラーが表示されないためです。 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が検出したすべてのエラーに関する情報が含まれています。
そして彼は次のタイプの故障を探しています。
- require \ includeのファイルがありません
- 未定義の関数/メソッドの呼び出し
- 未定義の変数、クラス、定数へのアクセス
- 定数をオーバーライドする
- 関数定義の同一の引数名
- 関数定義のオプションの後の必須引数
- 関数を呼び出すときの引数の不足/冗長性
- いかなる条件下でも実行されないコード
- voidを返すメソッドと関数
- 静的メソッドで$ thisを使用する
- その他BadPHPIncludeFile、PHPIncludeFileNotFound、UnknownClass、UnknownBaseClass、UnknownFunction、UseEvaluation、UseUndeclaredVariable、UseUndeclaredGlobalVariable、UseUndeclaredConstant、UnknownObjectMethod、InvalidMagicMethod、BadConstructorCall、DeclaredVariableTwice、DeclaredConstantTwice、BadDefine、RequiredAfterOptionalParam、RedundantParameter、TooFewArgument、TooManyArgument、BadArgumentType、StatementHasNoEffect、UseVoidReturn、MissingObjectContext、MoreThanOneDefault、InvalidArrayElement、有効な
ファイル内の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/-必見!