Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて

 20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて

2026-05-09 PHPカンファレンス香川2026 レギュラートーク資料
https://fortee.jp/phpconkagawa-2026

Avatar for Atsushi Matsuo

Atsushi Matsuo

May 09, 2026

More Decks by Atsushi Matsuo

Other Decks in Programming

Transcript

  1. 20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 自己紹介 はじめに 松尾篤 • PHP使用歴:約21年 • PHPを使った開発歴は約18年 • 2023年4月にGaroon開発チームに加入

    • Garoonのセキュリティを維持するYukimiチームの紹介 https://blog.cybozu.io/entry/2023/10/04/101916 • 過去にコントリビュートしたことがあるPHP関連のOSS(抜粋) • Phan • PHP-Parser • Smarty • Windows版PHP用libxml2 4
  2. 20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 開発チームで使用していた静的解析ツール 開発チームで使用していた静的解析ツールで直面した課題 • 2016年にPHP 5からPHP 7への移行をスムーズに行うためにPhanを導入 • (日本語訳) Migrating

    Garoon codebase to PHP 7 - Cybozu Inside Out https://blog.cybozu.io/entry/2017/10/16/080000 • PhanのベースラインとCIのキャッシュを利用してPhanのルールが自動的 に強くなる仕組みを作成 • CircleCIで勝手に強くなる静的解析の作り方 - Cybozu Inside Out https://blog.cybozu.io/entry/2020/07/08/080000 • CI/CDパイプラインではPhanを長年使用していた状況 • 必要に応じてPHPStanも併用 8
  3. 20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Phanで直面した機能面の課題 開発チームで使用していた静的解析ツールで直面した課題 • 2025年2月に製品で使用しているPHPをPHP 8.3に更新したが、当時の PhanがPHP 8.3の構文を公式にサポートしていない状況だった • 実際に検証しPHP

    8.3の構文のうち一部未対応の箇所が残っていたことを確認 9 // 未対応だった構文の一例 // https://www.php.net/releases/8.3/ja.php#dynamic_class_constant_fetch <?php class MyClass { const BAR = 'bar'; } $bar = 'BAR'; echo MyClass::{$bar}; // PHP 8.3で追加された動的なクラス定数へのアクセスがPhan 5.4.5では未対応
  4. 20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて サイボウズのOSSポリシー OSSへのコントリビューション事例と現状 • https://blog.cybozu.io/entry/oss-policy • 多くの企業で活用いただけるよう2018年にCC0(いかなる権利も保有しない、 いわゆるパブリックドメイン)で公開 • https://cybozu-oss-policy.readthedocs.io/ja/

    • 社員がOSS関連活動を過大な負担なく行えるよう支援 • オープンソースコミュニティにおける良き一員であるために必要なことを規定 • 「他者 OSS の不具合を発見した場合、従業員は、速やかに当該不具合を報告 するよう努めるものとする」と明記 17
  5. 20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 解決アプローチ:OSSへのコントリビューション OSSへのコントリビューション事例と現状 • 同じYukimiチームのメンバーがイシューを登録 • Dynamic class constant or

    enum member access causes AssertionError: $constant_name must be a string : https://github.com/phan/phan/issues/4961 • Phan reports false positive for deep-cloning of readonly properties : https://github.com/phan/phan/issues/4962 • 同じYukimiチームのメンバーがプルリクエストを送付 • 動的なクラス定数へのアクセスに関するPR : https://github.com/phan/phan/pull/4963 • 触発されて自分もプルリクエストを送付 • 読み取り専用プロパティのディープクローンに関するPR : https://github.com/phan/phan/pull/4964 18
  6. 20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Magoの現況 今後に向けて注目しているMago • 開発が活発 • 2024年12月にMago 0.0.1がリリース • 2025年12月にMago

    1.0.0がリリース • 頻繁にリリースされていて2026年5月9日現在の最新バージョンは1.26.0 • 対応も迅速 • イシューを登録するとすぐに対応してくれた 23
  7. 20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 現時点ではPhanを継続利用することに 巨大で歴史あるコードベースでの静的解析ツールの使い方と今後の展望 • 評価基準は「現場で使い続けられるか」 26 観点 Phan PHPStan Mago

    PHP新バージョンへの追従 ◦ バージョン5.5.0以降で改善 (バージョン6.0.0でPHP 8.5に も対応) ◎ 将来追従への安心感がある ◦ 活発に開発中(2025年12月 にバージョン1.0.0がリリースさ れたばかり) 既存コードとの相性 ◎ 歴史ある現行コードに馴染む △ require_onceを多用するコー ドで課題 △ 要検証 実行速度 ◦ 実運用可能 △ CIで30分近くかかることも ◎ 120万行超でも30秒以内 総合判断 継続利用 補助的に利用 実際に使えるかこれから検証
  8. 20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 巨大で歴史あるコードベースでの静的解析ルールの使い方 巨大で歴史あるコードベースでの静的解析ツールの使い方と今後の展望 • 静的解析のルールは自動的に少しずつ強くする • ルールを強められる場合には自動的に少しずつ強くする • 既存コードの問題は無視したまま、新規作成されたファイルでは強いルールで 静的解析を行う

    • PHPのバージョンアップで影響を受ける箇所を適宜把握してリスクが高く 修正コストが低いところから静的解析で検知した問題に順次対応していく ➢ 重要なのは「いきなり理想の静的解析ルールを適用すること」ではなく 「継続して改善しながら運用していけること」 28
  9. 20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 関連リンク 付録 • Cybozu Inside Out | サイボウズエンジニアのブログ https://blog.cybozu.io/

    • (日本語訳) Migrating Garoon codebase to PHP 7 • https://blog.cybozu.io/entry/2017/10/16/080000 • CircleCIで勝手に強くなる静的解析の作り方 • https://blog.cybozu.io/entry/2020/07/08/080000 • OSS初心者のコントリビュート - 業務で困ったPhanの問題を解決してみた • https://blog.cybozu.io/entry/2025/10/06/113000 32