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
自分が信じられないから静的解析が好きです
Search
Satoshi Kaneyasu
September 28, 2023
Programming
270
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
自分が信じられないから静的解析が好きです
Satoshi Kaneyasu
September 28, 2023
More Decks by Satoshi Kaneyasu
See All by Satoshi Kaneyasu
運用ダッシュボードの設計を誰も教えてくれないのだけどみなさんどうしてるんですか? - チームに監視するという文化を根付かせるための第一歩を踏みたい -
satoshi256kbyte
0
28
AWS CDK ExpressモードとCI/CDの組み合わせ
satoshi256kbyte
1
38
AWS CDK ExpressモードとCI/CDの組み合わせ
satoshi256kbyte
0
16
AWS re:Invent 2025の少し振り返り + DevOps AgentとBacklogを連携させてみた
satoshi256kbyte
3
220
Amazon_Cognito_で構築する_スケーラブルな_Web_アプリケーション__シングルページ_Web_アプリケーションに認証を組み込む
satoshi256kbyte
0
43
人間とAI、どちらが書いたコードもCI/CDでチェックしてみよう
satoshi256kbyte
0
45
今こそ押さえておきたい アマゾンウェブサービス(AWS)の データベースの基礎 おもクラ #6版
satoshi256kbyte
1
290
今こそ押さえておきたい アマゾンウェブサービス(AWS)の データベースの基礎
satoshi256kbyte
1
63
人間とAI、どちらが書いたコードもCICDでチェックしてみよう
satoshi256kbyte
1
93
Other Decks in Programming
See All in Programming
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
230
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
2.3k
Foundation Models frameworkで画像分析
ryodeveloper
1
140
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
150
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
110
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
550
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
180
継続モナドとリアクティブプログラミング
yukikurage
3
650
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
180
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
340
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1033
470k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Mind Mapping
helmedeiros
PRO
1
290
Making Projects Easy
brettharned
120
6.7k
The Limits of Empathy - UXLibs8
cassininazir
1
550
Game over? The fight for quality and originality in the time of robots
wayneb77
1
230
Agile that works and the tools we love
rasmusluckow
331
22k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
420
Darren the Foodie - Storyboard
khoart
PRO
3
3.5k
Designing for humans not robots
tammielis
254
26k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
390
AI: The stuff that nobody shows you
jnunemaker
PRO
9
840
Transcript
⾃分が信じられないから 静的解析が好きです 2023.09.27 SATOSHI KANEYASU
⾃⼰紹介 ⽒名︓兼安 聡 所属︓株式会社サーバーワークス 最近のお仕事︓DevOpsの推進 趣味︓サックス、筋トレ、CS ゲーム 資格︓ X(Twitter)︓@satoshi256kbyte など
購入しました 明日、受け取りに 行きます
アジェンダ • [エピソード]システムのVerupにおける静的解析の活⽤ • 廃⽌された関数・変数の置換チェック • 独⾃ルールのソースの静的解析、その課題と対策 • 静的解析の⾃動化 •
⾃動化できなかったこと • pre-commitでコミット差分だけ静的解析 • まとめ
システムのVerupにおける静的解析の活⽤ • ⾔語はPHP • フレームワークバージョンアップ • フレームワークのVerupは破壊的変更、廃⽌された関数・変数は多数 • バージョンアップ前・後、両⽅のFWの知識があるのは極少数 •
品質担保の⼀環として、静的解析(PHPStan)を使⽤
廃⽌された関数・変数の抽出に⽤いる • 旧Verのコードは、ほとんどが何らかの修正が必要 • 正規表現&⼿作業で⼀通り修正 • レビュー&⼿動テストでは改修成否のチェックは不可と判断し、 静的解析を採⽤ • 静的解析の準備は(個⼈的には)まあまあ⼤変というレベル
• 効果は「特⼤」、これがないとまともな品質にはならなかっただろう
廃⽌された関数・変数の置換チェック • 廃⽌された関数・変数が正しく置換されてるか、静的解析でチェック • 配列に関する警告等、修正のタイパが悪すぎるものは無視リスト • 最終的には、PHPStanのBaselineも活⽤ • 効果があったことから、 新規だけでなく改修PJでも静的解析は⾮常に有効と考えている
ある時点より前のエラーは認識済とみなす ある時点以降新たに出たエラーだけチェック Baseline
独⾃ルールのソースの静的解析、その課題と対策 • 独⾃のビジネスロジック置き場がある • そのままでは静的解析できない • PHPStanのFW⽤の拡張を更に拡張して、 独⾃のビジネスロジック置き場もフォロー • 拡張ライブラリは、独⾃とはいえFWの
ルールを参考にしていたのでスムーズに作 れた src Controller Business Model View /
静的解析の⾃動化 • AWS CodeBuildで静的解析を⾃動実⾏ • CodeBuildはdevelopへのコミットで起動 • マージのタイミングで全体の解析を⾏うので、 思わぬエラーを拾えた •
最終的には静的解析+独⾃のシェルで、 例外の隠蔽やSQLインジェクションも⾃動抽出 AWS CodeBuild AWS CodeCommit AWS CodeDeploy
⾃動化できなかったこと • AWS CodeBuildで⽔際対策はできた • しかし、静的解析NGなコードはコミットして欲しくないのが本⾳ • コミット前にローカルで静的解析するようルール付けしたが、 定着しなかった
pre-commitでコミット差分だけ静的解析 • 前述の経験を踏まえて改善 • Node.jsのhuskyを使⽤すると、 コミット前にタスクを⾃動実⾏可能 • 開発者が個々に設定する必要はない .husky pre-commit
/ src phpstan-commit.sh
コミット差分だけ静的解析するシェル #!/bin/bash FILES=$(git diff --cached --name-only --diff-filter=ACM | grep "^src/.*¥.php$")
if [ "$FILES" != "" ]; then vendor/bin/phpstan analyse --level=max $FILES if [ $? -ne 0 ]; then echo "PHPStan failed" exit 1 fi fi phpstan-commit.sh
pre-commitで静的解析を実⾏ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" ./phpstan-commit.sh .husky/pre-commit
コミット時の出⼒サンプル > git -c user.useConfigOnly=true commit --quiet --allow-empty-message --file -
Note: Using configuration file /home/ec2-user/husky-phpstan/phpstan.neon. 0/1 [░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 0% [1G [2K 1/1 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100% ------ ------------------------------------------------------------ Line sample1.php ------ ------------------------------------------------------------ 6 Parameter #1 $a of function add expects int, string given. 6 Parameter #2 $b of function add expects int, string given. ------ ------------------------------------------------------------ [ERROR] Found 2 errors PHPStan failed husky - pre-commit hook exited with code 1 (error)
まとめ • 静的解析は改修案件でも有効 • pre-commitを使えば、静的解析のルール化も可能 コードレビューの前準備︕ • pre-commitで静的解析した上で、 CI/CDパイプラインに繋げて更なる改善に繋げたい 私はもう静的解析は⼿放せない
以上、ありがとうございました。