PHPで静的コード分析を実行するにはどうすればよいですか?[閉まっている]


466

PHPソースファイルの静的分析ツールはありますか?バイナリ自体は構文エラーをチェックできますが、次のような他のことを行うものを探しています。

  • 未使用の変数割り当て
  • 最初に初期化されずに割り当てられる配列
  • そしておそらくコードスタイルの警告
  • ...

57
Righty-o:SOによってクローズされました。明らかに、この種の回答が非常に役立つ場合。
Ira Baxter

3
同意する。この質問は重要です。php lint(php -l file)が残りの半分を提供できません。オートロードを実行し、呼び出された関数が存在すること、変数が存在すること、オブジェクトプロパティが存在することを確認してください。等
Max

6
@IraBaxterは有用ですが、厳密にはトピックではありません。softwarerecs.stackexchange.comは、おそらくもっと話題の場所です。もちろん、ここで皮肉なのは、兄弟よりもはるかに多くの開発者がSOに精通しているということです
Wayne Werner

7
非常に多くの人々がこのタイプの質問を有用だと思っているという事実は、おそらくソフトウェアレックが存在する理由です。これが唯一のスタック交換サイトだったとき、それは確かに話題に戻ったようでした。明確な場所があるので、移行することは理にかなっていますか?
eswald

4
トリガーハッピークローザーのため閉鎖されました。ば!
Roadowl 2016年

回答:


356

コマンドラインからlint-modeでphpを実行して、実行せずに構文を検証します。

php -l FILENAME

上位レベルの静的アナライザーには、次のものがあります。

下位レベルのアナライザーには次のものがあります。

PHPの動的な性質により、いくつかの場合により有用なランタイムアナライザーには、次のものがあります。

ドキュメントライブラリphpdocdoxygenは、一種のコード分析を実行します。たとえば、doxygenはgraphvizを使用して継承グラフを表示するように構成できます。

もう1つのオプションはxhprofです。これはxdebugに似ていますが、より軽量で、本番サーバーに適しています。このツールには、PHPベースのインターフェースが含まれています。


20
これらすべての良さを試すために私の人生の6時間を費やした+1!
阿部ペトリロ

14
@dimitko:これphp -lは、一度に1つの入力ファイルしか読み取れないためです(つまり、を実行すると機能しませんphp -l file1.php file2.php)。代わりに-n 1xargsコマンドプロセスごとに1つの入力行のみを使用するように指示するオプションを使用する必要があります。代わりに、個別にが実行php -l file1.phpphp -l file2.phpれます。同時に、あなたは使用することができ-P <n>、実行を並列化するために、一度にプロセスを実行する「N」する:find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
ジョー・

11
find /your/path -name '*.php' -exec php -l {} \;信頼できる作品。
公園。

11
:組み込みのlint関数(php -l)を機能させるにdisplay_errors = onphp.ini、で設定する必要があります。そうしないと、構文エラーがあることに関する一般的なメッセージのみが表示され、どのエラーまたはどの行に関する詳細が表示されません。
Synetech 2013

8
Synetech-いいね。-dスイッチを使用して、コマンドラインの設定を上書きすることもできます。例えばphp -l -d display_errors=on $FILENAME
troelskn



24

PHP Mess Detectorは素晴らしく高速です。


7
ありがとうございました!私は素晴らしいものを探していました。実際、私は素晴らしいツール以外のものを使用することを拒否します。:)
Falken教授の契約が

1
それは出発点であり、それはNetbeansが使用しているもののようですが、私はそれを完全に信頼しません。そのオプションのいくつかはただ奇妙なものであり(elseステートメントを使用する場合に「警告」しますか?)、その検出には多数の大きなバグがあり、開発者からの応答さえありませんでした:github.com/phpmd / phpmd / issues
NoBugs 2015年

それ以外の場合は循環的複雑性が追加され、回避するために別の方法で記述することができます。例:(true){$ x = 1; } else {$ x = 2; }は次のように書き換えることができます:$ x = 2; if(true){$ x = 1; }
RichardAtHome 2017年

17

$ php -lと他のいくつかのツールを使用してみました。しかし、私の経験(もちろんYMMV)で最高のものはpfffツールセットのscheckです。Quoraでpfffについて聞いた(http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool

コンパイルしてインストールできます。素敵なパッケージはありません(私のDebianでは、最初にlibpcre3-dev、ocaml、libcairo-dev、libgtk-3-dev、libgimp2.0-devの依存関係をインストールする必要がありました)。

結果は次のように報告されます

rjha@mint ~ $ ~/sw/pfff/scheck ~/code/github/sc/
login-now.php:7:4: CHECK: Unused Local variable $title
go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl.

ありがとうございました。動的インポートについて文句を言い続けますが、他の機能は今のところ良好です。また、binutils-goldをインストールする必要があり、scheckをカスタムパスにインストールする必要がありましたが、現在は機能しているようです。
eswald

1
@eswald今、私はphp mess Detector(phpmd)に変換しています。これまでに試したすべてのツール(php code sniffer、scheck、php -l、phpmd)のうち、IMHO、phpmdが私の場合に最適です。
rjha94 2012年

Scheckの場所を知っていますか?
ジョージKatsanos 2013年

1
@GeorgeKatsanos scheckはpfffツールセットの一部です。github.com/facebook/pfff
rjha94

2
Scheckは常に「phpチェッカーにはグラフファイルが必要です」というエラーを表示します。ほとんど存在しないドキュメントには例がありません。
ロバートブルース

14

コピー/貼り付け/編集されたコードを見つける「クローン検出」ツールであるSemantic DesignsのCloneDRを参照してください。空白、コメント、さらには変数の名前変更にかかわらず、正確でほぼミスのコードフラグメントを検出します。PHPの検出レポートのサンプルは、ウェブサイトにあります。(私は著者です)。


1
サイトを見ると、それは信じられないほどのツールのようです。後で詳しく見ていきます!リンクをありがとう( "I'm the author"も+1)
Eric Cope、

貧しい学部生の悩みの種。
wom

7

NetBeans IDEは、構文エラー、使用されていない変数などをチェックします。自動化されていませんが、中小規模のプロジェクトでは問題なく機能します。


6

PHP用のnWireと呼ばれる新しいツールがあります。これは、Eclipse PDTおよびZend Studio 7.xのコード探索プラグインです。PHPのリアルタイムコード分析を可能にし、次のツールを提供します。

  • コードの視覚化-コンポーネントと関連付けのインタラクティブなグラフィカル表現。
  • コードナビゲーション-ユニークなナビゲーションビューはすべての関連付けを表示し、コードの作成または読み取り中に機能します。
  • クイック検索-メソッド、フィールド、ファイルなどを入力しながら検索

1
質問に対する答えではありません。その答えのようにNetBeansの存在など。
Yosef

5

PHPUnitの前の部分としてのPHP PMD(プロジェクト混乱検出器)およびPHP CPD(コピー貼り付け検出器)


4

PHPスクリプトの脆弱性のための静的ソースコードアナライザーRIPSがあります。SourceForgeで入手可能なRIPSのソース。

RIPSサイトから:

RIPSは、静的コード分析を使用してPHPアプリケーションの脆弱性を見つけるためにPHPで記述されたツールです。すべてのソースコードファイルをトークン化して解析することで、RIPSはPHPソースコードをプログラムモデルに変換し、プログラムフロー中にユーザー入力(悪意のあるユーザーの影響を受ける)によって汚染される可能性のある機密シンク(潜在的に脆弱な関数)を検出できます。検出された脆弱性の構造化された出力に加えて、RIPSはさらに手動で分析するための統合コード監査フレームワークを提供します。


RIPSは中途半端なプロジェクトであり、OOP以外のphpコードでのみ動作します。
alexglue 2014

3

PHPアナライザーと呼ばれる静的コード分析用の絶対に新しいツールがあります。

多くのタイプの静的解析の中で、基本的な自動修正機能も提供しますドキュメントを参照してください。

更新:PHP-Analyzerは非推奨のプロジェクトになりましたが、レガシーブランチで引き続きアクセスできます


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.