Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて
Search
Atsushi Matsuo
May 09, 2026
Programming
110
0
Share
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて
2026-05-09 PHPカンファレンス香川2026 レギュラートーク資料
https://fortee.jp/phpconkagawa-2026
Atsushi Matsuo
May 09, 2026
More Decks by Atsushi Matsuo
See All by Atsushi Matsuo
個人的に嬉しかったpnpmの新機能・3選
matsuo_atsushi
0
120
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
320
テストやOSS開発に役立つSetup PHP Action
matsuo_atsushi
0
290
PHPライセンス変更の議論を通じて学ぶOSSライセンスの基礎
matsuo_atsushi
0
280
Windows版PHPのビルド手順とPHP 8.4における変更点
matsuo_atsushi
0
1.6k
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
580
OSSの開発や貢献時に役立つRFC
matsuo_atsushi
0
260
PHPの開発に貢献する4つの方法
matsuo_atsushi
0
480
Other Decks in Programming
See All in Programming
Cache-moi si tu peux : patterns et pièges du cache en production - Devoxx France 2026 - Conférence
slecache
0
320
実践CRDT
tamadeveloper
0
610
決定論 vs 確率論:Gemini 3 FlashとTF-IDFを組み合わせた「法規判定エンジン」の構築
shukob
0
140
WebAssembly を読み込むベストプラクティス 2026年春版 / Best Practices for Loading WebAssembly (Spring 2026)
petamoriken
4
970
ついに来た!本格的なマルチクラウド時代の Google Cloud
maroon1st
0
320
Don't Prompt Harder, Structure Better
kitasuke
0
800
Oxlintとeslint-plugin-react-hooks 明日から始められそう?
t6adev
0
310
mruby on C#: From VM Implementation to Game Scripting (RubyKaigi 2026)
hadashia
2
1.3k
Kingdom of the Machine
yui_knk
2
1.3k
AIエージェントで業務改善してみた
taku271
0
550
JAWS-UG横浜 #100 祝・第100回スペシャルAWS は VPC レスの時代へ
maroon1st
0
200
検索設計から 推論設計への重心移動と Recall-First Retrieval
po3rin
5
1.3k
Featured
See All Featured
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
220
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.3k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Done Done
chrislema
186
16k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
820
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
Practical Orchestrator
shlominoach
191
11k
WCS-LA-2024
lcolladotor
0
560
We Have a Design System, Now What?
morganepeng
55
8.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
Transcript
20年以上続くプロダクトでも 使い続けられる静的解析ツールを求めて 2026年5月9日 PHPカンファレンス香川2026 サイボウズ株式会社 松尾篤 1
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて このトークで伝えたいこと はじめに • PHPの変化に追従および備える上で静的解析は役に立つこと • 重要なのは「いきなり理想の静的解析ルールを適用すること」ではなく 「継続して改善しながら運用していけること」 • 皆さんもOSSへのコントリビューションに取り組んでみませんか
2
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 今回の話題 はじめに • 開発チームで使用していた静的解析ツールで直面した課題 • 静的解析ツールを変更しようとして遭遇した問題 • OSSへのコントリビューション事例と現状 •
今後に向けて注目しているMago • 巨大で歴史あるコードベースでの静的解析ツールの使い方と今後の展望 3
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
開発チームで使用していた 静的解析ツールで直面した課題 5
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて サイボウズ Garoon 開発チームで使用していた静的解析ツールで直面した課題 • 中堅・大規模組織向けグループウェア • チーム、部署、全社に必要な情報が集約され一目で確認できる • 20年以上開発が続いている巨大なコードベースを持つプロダクト
• 2002年9月にパッケージ版Garoonの提供を開始 • 2011年12月にクラウド版Garoonの提供を開始 • 長い歴史の中で多様な実装パターンが蓄積 • 古い書き方と新しい書き方が混在 6
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 静的解析 開発チームで使用していた静的解析ツールで直面した課題 • プログラムを実行せずにソースコードを解析して潜在的な不具合や品質上 の問題を検出する手法 • 代表的なPHP向け静的解析ツール • PHPStan
: https://github.com/phpstan/phpstan • Psalm : https://github.com/vimeo/psalm • Phan : https://github.com/phan/phan • Mago : https://github.com/carthage-software/mago 7
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
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では未対応
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Phanに対する継続性への不安 開発チームで使用していた静的解析ツールで直面した課題 • 2023年11月にPHP 8.3がリリースされてから1年半近くPhanがPHP 8.3 の構文に対応していなかった • 2024年8月にPhan
5.4.5が公開された後、目立ったコミットが2025年3月頃 まであまりない状況だった 10
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Phanの代替としてPHPStanへの移行を検討 開発チームで使用していた静的解析ツールで直面した課題 • 常に最新のセキュリティ更新を取り込み続けるために今後も定期的にPHP をバージョンアップしていく必要がある • 将来予定されているPHP 9の破壊的変更に備えられる状態にしていきたい 11
静的解析ツールを変更しようとして 遭遇した問題 12
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて PHPStanへの移行で遭遇した問題 静的解析ツールを変更しようとして遭遇した問題 • 長い歴史の中で積み重なったコードとの互換性でつまづく • require_onceを多用している既存コードでたびたび誤検知が発生 • 解析速度もボトルネックに •
PHPスクリプトのソースコードだけでも120万行以上ある製品 • PHPStanを走らせるCIジョブの実行に30分近くかかることも 13
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 対応方法で悩んでいたところにPhanの状況に変化 静的解析ツールを変更しようとして遭遇した問題 • 見直しを進めている最中にPhanがアップデート • Phan 5.4.6が2025年6月9日にリリース • PHP
8.3とPHP 8.4の構文に対応 ➢ Phanを改めて再評価することに 14
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Phan 5.4.6でも前回調査時と同様のエラーを観測 静的解析ツールを変更しようとして遭遇した問題 • 動的なクラス定数へのアクセスがPhan 5.4.6でも未対応 • 読み取り専用プロパティのディープクローンも誤検知する状態のまま 15
PHP 8.3以降ではreadonlyプロパティをクローンする際、__cloneメソッド内で一度だけプロパティを変更できるように
OSSへのコントリビューション事例と現状 16
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて サイボウズのOSSポリシー OSSへのコントリビューション事例と現状 • https://blog.cybozu.io/entry/oss-policy • 多くの企業で活用いただけるよう2018年にCC0(いかなる権利も保有しない、 いわゆるパブリックドメイン)で公開 • https://cybozu-oss-policy.readthedocs.io/ja/
• 社員がOSS関連活動を過大な負担なく行えるよう支援 • オープンソースコミュニティにおける良き一員であるために必要なことを規定 • 「他者 OSS の不具合を発見した場合、従業員は、速やかに当該不具合を報告 するよう努めるものとする」と明記 17
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
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Phan 5.5.0で問題が解決 OSSへのコントリビューション事例と現状 • 各プルリクエストがマージされて2025年6月末にPhan 5.5.0がリリース • 結果としてPhanで見つかった問題を自分たちで解決できた •
継続可能性と現実的な保守コストを踏まえ引き続きPhanを使う判断に • 反省点:最初の調査時に未対応箇所を確認した時点で報告すべきだった 19
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて OSSにコントリビュートしてよかったこと OSSへのコントリビューション事例と現状 • 独自にパッチを作る必要がなくなった • OSS活動を通して課題を解決する経験がチームでできた • チーム内でツール内部への理解が深まった •
結果として「Phanを継続利用できる」判断材料になった 20
今後に向けて注目しているMago 21
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Mago 今後に向けて注目しているMago • Rustで記述されたPHP向け開発支援ツール • 1つのバイナリで静的解析ツール(mago analyze)、リンター(mago lint)、 フォーマッター
(mago format)の役割を備える • 非常に高速 22 引用元 : https://mago.carthage.software/#benchmarks
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Magoの現況 今後に向けて注目しているMago • 開発が活発 • 2024年12月にMago 0.0.1がリリース • 2025年12月にMago
1.0.0がリリース • 頻繁にリリースされていて2026年5月9日現在の最新バージョンは1.26.0 • 対応も迅速 • イシューを登録するとすぐに対応してくれた 23
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 個人的にMagoに注目している理由 今後に向けて注目しているMago • 高速なので大規模コードベースでも実用的に使える可能性がある • 120万行以上あるコードに対して試しに実行したところ約30秒で解析が完了 • ただし、mago lintで検出されるルールがmago
analyzeに実装されていない ものもあったりする状況 • 今すぐ全面移行はせず将来の移行候補もしくはPhanを補完するツールとして 検証中 24
巨大で歴史あるコードベースでの 静的解析ツールの使い方と今後の展望 25
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秒以内 総合判断 継続利用 補助的に利用 実際に使えるかこれから検証
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 得た学び 巨大で歴史あるコードベースでの静的解析ツールの使い方と今後の展望 • OSSは「使うだけ」の対象ではなく「一緒に育てる」対象にもなる • 巨大で歴史あるコードベースでは互換性、保守コストそして速度が重要 • 既存のコードベースに対する深い理解と継続的な改善も大事 27
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 巨大で歴史あるコードベースでの静的解析ルールの使い方 巨大で歴史あるコードベースでの静的解析ツールの使い方と今後の展望 • 静的解析のルールは自動的に少しずつ強くする • ルールを強められる場合には自動的に少しずつ強くする • 既存コードの問題は無視したまま、新規作成されたファイルでは強いルールで 静的解析を行う
• PHPのバージョンアップで影響を受ける箇所を適宜把握してリスクが高く 修正コストが低いところから静的解析で検知した問題に順次対応していく ➢ 重要なのは「いきなり理想の静的解析ルールを適用すること」ではなく 「継続して改善しながら運用していけること」 28
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 今後の展望:役割を絞ってMagoを補助的に使ってみることを検討中 巨大で歴史あるコードベースでの静的解析ツールの使い方と今後の展望 • 1つのツールだけに依存していると見逃している問題があるかもしれない • Phanをメインで使いつつMagoを次の用途で補助的に使い始めてみたい (今すぐ全面移行はせず将来の移行候補として) • 複数のツールを使って見逃しを減らす
• ベースラインで隠れている問題を別観点でチェックする • すでに直した種類の問題が再発していないか確認する 29
まとめ 30
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて まとめ まとめ • PHPの変化に追従および備える上で静的解析は役に立つ • 巨大で歴史あるコードベースでは互換性、保守コストそして速度が重要 • 問題はOSSへのコントリビューションで解決できる場合もある •
既存のツールを使いつつ新しいツールも検証しながら併用していきたい ➢ 皆さんもOSSへのコントリビューションに取り組んでみませんか 31
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
©️ Cybozu, Inc. 33