ANNAI magazine
Drupal サイトのコード品質をチェックするには
この記事の目次

動的解析と静的解析

プログラムコードを検査する手法の分類として、動的か静的かという観点があります。

動的解析とは、実際にプログラムを動かして正常に動作するかどうかを検査する手法です。運用中の Web サイトは基本的にこの検査を通過していると見なすことができるでしょう。これに対して、静的解析とは、対象となるプログラムコードを実行することなく、特定の基準に基づいてコードそのものを対象に検査を行う手法です。本来こうあるべき、という基準と相違する部分を検出するわけです。ソフトウェア開発の現場で行われるコードレビューも一種の静的解析ですが、コードの規模やチェック項目が多くなってくると、人間によるチェックには限界があります。そこで、チェックの基準を形式的に表現し、それとの相違点をプログラムで自動検出する仕組みが考えられました。これが静的解析ツールです。

Drupal サイトの診断に静的解析ツールを使用する

こうした概念やツールはもともとソフトウェアの品質試験で使われてきたものですが、同じ考え方を Web サイトの診断に適用することで、メンテナンスやセキュリティーの基準に合わない部分を検出することが可能です。実際に Web サイトの診断に利用できるツールも数多く存在します。以下、Drupal サイトの静的解析に用いられるツールをいくつか紹介しましょう。

PHP_CodeSniffer(phpcs)

https://github.com/squizlabs/PHP_CodeSniffer

あらかじめ定義されたコーディング標準に違反するコードを検出するツールで、PHP のほか JavaScript や CSS にも使用できます。コマンド名の phpcs という名前でも知られるツールです。

また、Web サイトの診断とは直接関係しませんが、phpcs で検出した違反部分を自動修正する phpcbf という関連ツールもあります。開発段階からこうしたツールでチェックしながらコードを記述することで、ルールに準拠した適性なコードを維持することができます。

Coder

https://www.drupal.org/project/coder

Drupal のコーディング標準やベストプラクティスを基準に、Drual のコード品質をチェックします。具体的には、先に紹介した phpcs で使われる検査基準としてインストールされます。Drupal コーディング標準は「Drupal」、ベストプラクティスは「DrupalPractice」という名前でそれぞれ提供され、phpcs の --standard オプションに指定することで、その基準に基づく静的解析を実行できます。たとえば、あるモジュールを Drupal コーディング標準を基準にチェックするには、次のコマンドを実行します。

phpcs --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md <モジュールのパス>

PAReview.sh

https://www.drupal.org/project/pareviewsh

脆弱性への対応と信頼性の高さは Drupal の特徴の 1 つですが、その基盤となるのが各プロジェクトのセキュリティー検査とそれに基づいて発行されるセキュリティーアドバイザリーです。

PAReview.sh は、この検査の対象プロジェクトとして認められるためのチェック項目の検査を行う Bash スクリプトです。また、このスクリプトをオンラインで実行するサービス paraview.sh もあります。いずれも、プロジェクトのリポジトリーの URL を指定して実行することで検査結果のレポートが表示されます。

PAReview.sh のトップページ

Drupa.org で公開されるプロジェクト(モジュールやテーマ)を対象とするものなので、個々の Web サイトの診断に直接使えるものではありませんが、使用モジュールのコード品質を把握するとき等に利用できるでしょう。

PHPMD

https://phpmd.org/

Drupal 専用ではありませんが、さまざまなルールに基づいて PHP コードの問題を検出するツールです。コード整形、サイズや複雑さ、設計、命名に関する問題箇所や、未使用コードの存在などを調べることができます。

JavaScript用の静的解析ツール

ESLintJSLintJSHint など、JavaScript 用の静的解析ツールも複数存在します。Drupal で構築したサイトの中にも、その機能を実現する上で JavaScript が重要な役割を果たす例は増えおり、特にそうしたサイトでは、PHP だけでなく JavaScript のコード品質にも注意が必要です。

phploc

https://github.com/sebastianbergmann/phploc

PHP プロジェクトのサイズと、PHP のソースコードを構成する各種要素の数を調べてレポートします。Web サイトに限らず、PHP で記述されたプロジェクトの大まかな規模を把握することができます。

phploc の実行例

静的解析の限界と経験知

こうした自動化ツールを活用することで、コードに潜む問題点をより効率的に検出できるようになるでしょう。

他方、静的なコード解析には限界もあります。特に、自動化ツールを使うときは次の点に注意が必要です。

  • 誤検出の可能性
  • すべての欠陥を検出できているかのような錯覚
  • 使用する基準に基づく検証でしかない
  • 実行時の環境に起因する脆弱性は発見できない

ツールは便利ですが、それが何を行っているのかを本質的に理解した上で使わないと、得られた結果を適切に生かすことはできません。最悪の場合、誤った解釈で不適切な対応を助長してしまう可能性もあります。

たとえば、静的解析ツールで採用している基準そのものが、自分たちのコーディングルールやガイドラインと異なるために大量の「誤検出」が発生する場合もあります。基準をどう設定するかは難しい問題ですが、OSS を使う場合のベストプラクティスとしては、フレームワークやライブラリー、コミュニティーで定められたルールやガイドラインに従うべきでしょう。

ツールの実行結果を的確に判断し、必要な対応を考えるのは人間であり、そこで力を発揮するのは経験の積み重ねから得られた知見です。ツールはそれ自体で完結するものではなく、それを使う人間の知識や経験と一緒になって初めて役に立つということです。

当社の KAIZENサービスでは、今回紹介したような静的解析ツールも活用しながら、経験豊富な技術者がお客様のサイトの診断、改善、保守の対応をいたします。一般的な脆弱性診断サービスとは異なり、Drupal の内部構造や技術要素をふまえたサイト改善案を提示することが可能です。Drupal サイト専業ならではの豊富な経験と知識を、大切な Web サイトの安定運営にお役立てください。

まとめ

今回は、サイトを構成するプログラムコードを検査する静的解析ツールとそのメリット、およびその限界について解説しました。ツールの有効性は、それを使う人間の知識と経験によって担保されるということですね。

さて、連載最後となる次回は、私たちが実際に関わった低品質サイトの事例に基づき、これだけは確認しておきたい、Web サイトのチェックポイントを紹介したいと思います。お楽しみに。