ast-grep-code-analysis について
ast-grep の構造パターンで複数ファイルの問題を探すコード分析スキルです。特に複雑なコードベースや大規模なコードベースで、安全性、パフォーマンス、構造のレビューを体系化します。
主な機能
- 01AST パターンによるコード照合
- 02セキュリティ関連パターンの分析
- 03React フックなどの性能パターン確認
- 04深いネストなど構造上の問題検出
- 05ルールセットの実行と JSON レポート生成
活用シーン
- 01大規模コードベースからハードコードされた秘密情報を検索
- 02React コードのフック依存関係パターンを確認
- 03複数ファイルから深くネストした制御フローを検出
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ zenobi-us/ dotfiles --skill ast-grep-code-analysisインストール後、Claude Code で/ast-grep-code-analysisを入力して読み込まれたか確認します。
詳細
AST-Grep コード分析
メモ
このスキルを使用するには、開発環境に
as-grepがインストールされ、設定されている必要があります。インストールされていない場合は、mise -g --pin ast-grepを使用できます。
概要
AST-Grep コード分析では、抽象構文木(AST)のパターンマッチングを使用してコードの問題を体系的に特定し、手作業での行単位の確認を構造的なパターン認識に置き換えます。
基本原則:コードの構造からは、表面的に読むだけでは得られない情報がわかります。AST パターンによって、手作業での確認では見逃される隠れた関係性、セキュリティ上の脆弱性、アーキテクチャ上の問題を明らかにできます。
使用する場面
digraph when_to_use {
"Need to analyze code?" [shape=diamond];
"Complex/nested structure?" [shape=diamond];
"Security review needed?" [shape=diamond];
"Performance analysis?" [shape=diamond];
"Use ast-grep patterns" [shape=box];
"Manual review sufficient" [shape=box];
"Need to analyze code?" -> "Complex/nested structure?" [label="yes"];
"Complex/nested structure?" -> "Security review needed?" [label="yes"];
"Security review needed?" -> "Performance analysis?" [label="yes"];
"Performance analysis?" -> "Use ast-grep patterns" [label="yes"];
"Complex/nested structure?" -> "Manual review sufficient" [label="no"];
"Security review needed?" -> "Manual review sufficient" [label="no"];
"Performance analysis?" -> "Manual review sufficient" [label="no"];
}
次の場合に使用します:
- コードにネストされた関数、複雑な制御フロー、複数の抽象化レイヤーがある
- セキュリティレビューが必要である(認証、認可、データ処理)
- パフォーマンス分析が必要である(React フック、ループ、非同期パターン)
- 手作業での確認が現実的でない大規模なコードベースである
- 複数のファイルにまたがるパターンを特定する必要がある
- 時間的な制約があり、場当たり的な分析より体系的なアプローチが求められる
次の場合は使用しないでください:
- 単純でわかりやすいコード(50 行未満)
- 構造が明白な単一ファイルのユーティリティ
- タスクにざっと目を通すだけで十分な場合
基本パターン
変更前(手作業での確認):
// Agent manually reads line by line
if (data[i].admin) {
userObj.token = generateToken(data[i].id); // "This looks insecure"
}
変更後(AST パターンマッチング):
# ast-grep rule: insecure-token-generation
rule:
pattern: |
function $FUNC($ARGS) {
const secret = $SECRET;
return btoa(JSON.stringify($PAYLOAD) + '.' + $SECRET);
}
meta:
severity: ERROR
message: "Hardcoded secret in token generation"
クイックリファレンス
| 分析の種類 | AST パターンの着眼点 | よく見つかる問題 |
|---|---|---|
| セキュリティ | 暗号関数内の文字列リテラル | ハードコードされたシークレット、脆弱な暗号化 |
| パフォーマンス | React フックの依存関係 | 無限の再レンダリング、メモリリーク |
| 構造 | 関数のネストの深さ | 複雑な制御フロー、保守性 |
| データフロー | 変数の代入と使用 | 未使用の変数、暗黙の依存関係 |
実装
インストールとセットアップ
# Install ast-grep
npm install -g @ast-grep/cli
# Initialize configuration
ast-grep init
# Create rules directory
mkdir -p sg-rules/security sg-rules/performance sg-rules/structure
基本的なセキュリティパターン
ハードコードされたシークレットの検出:
# sg-rules/security/hardcoded-secrets.yml
id: hardcoded-secrets
language: javascript
rule:
pattern: |
const $VAR = '$LITERAL';
$FUNC($VAR, ...)
meta:
severity: ERROR
message: "Potential hardcoded secret detected"
安全でないトークン生成:
# sg-rules/security/insecure-tokens.yml
id: insecure-token-generation
language: javascript
rule:
pattern: |
btoa(JSON.stringify($OBJ) + '.' + $SECRET)
meta:
severity: ERROR
message: "Insecure token generation using base64"
パフォーマンスパターンの検出
React フックの依存関係:
# sg-rules/performance/react-hook-deps.yml
id: react-hook-dependency-array
language: typescript
rule:
pattern: |
useEffect(() => {
$BODY
}, [$FUNC])
meta:
severity: WARNING
message: "Function dependency in useEffect may cause infinite re-renders"
useCallback による最適化の欠落:
# sg-rules/performance/missing-use-callback.yml
id: missing-use-callback
language: typescript
rule:
pattern: |
const $FUNC = ($ARGS) => {
$BODY
};
inside:
kind: function_declaration
has:
kind: arrow_function
meta:
severity: INFO
message: "Consider wrapping function in useCallback for optimization"
構造分析パターン
深いネストの検出:
# sg-rules/structure/deep-nesting.yml
id: deep-nesting
language: javascript
rule:
any:
- pattern: |
if ($COND1) {
if ($COND2) {
if ($COND3) {
$BODY
}
}
}
- pattern: |
for ($INIT) {
for ($INIT2) {
for ($INIT3) {
$BODY
}
}
}
meta:
severity: WARNING
message: "Deep nesting detected - consider refactoring"
分析の実行
# Run all security rules
ast-grep run -r sg-rules/security/
# Run performance analysis on React components
ast-grep run -r sg-rules/performance/ --include="*.tsx,*.jsx"
# Generate comprehensive report
ast-grep run -r sg-rules/ --format=json > analysis-report.json
# Interactive analysis
ast-grep run -r sg-rules/ --interactive
よくある間違い
| 間違い | 発生する理由 | 修正方法 |
|---|---|---|
| パターンが汎用的すぎる | あらゆるものを検出しようとする | 具体的で影響の大きいパターンに絞る |
| コンテキストの見落とし | パターンが周囲のコードを考慮していない | inside と has の制約を使う |
| 誤検出 | マッチングの範囲が広すぎる | not で否定の制約を追加する |
| 言語固有の想定 | JavaScript のパターンを TypeScript に適用する | 言語ごとに別々のルールを作成する |
| 重大度の優先順位付けがない | すべての問題をエラーとして扱う | 適切な重大度レベルを使用する |
実際の効果
AST 分析を導入する前:
- 手作業でのコードレビュー:中規模のコードベースで 2~3 時間
- 見落とされるセキュリティ上の脆弱性:40~60%
- レビュアー間で分析に一貫性がない
- パターン検出に体系的な方法がない
AST 分析を導入した後:
- パターンの自動検出:5~10 分
- セキュリティ上の脆弱性の検出率:90%以上
- 一貫性があり、繰り返し実行できる分析
- 既知のアンチパターンを網羅的に検出
結果の例:
$ ast-grep run -r sg-rules/
src/components/UserProfile.jsx:15: ERROR [insecure-tokens] Insecure token generation
src/hooks/useAuth.js:8: ERROR [hardcoded-secrets] Potential hardcoded secret
src/components/UserProfile.jsx:23: WARNING [react-hook-deps] Function dependency may cause re-renders
src/utils/processData.js:45: WARNING [deep-nesting] Deep nesting detected
Found 4 issues (2 errors, 2 warnings)
統合ワークフロー
- セットアップ:セキュリティ、パフォーマンス、構造のルールセットを作成する
- ベースライン:既存のコードベースで分析を実行し、パターンを確立する
- 反復:誤検出や検出漏れに基づいてルールを改善する
- 自動化:継続的な分析のため、CI/CD パイプラインに統合する
- 監視:問題が時間とともに減少しているか追跡する
必要な基礎知識:AST の概念、パターンマッチング、コード構造分析への理解。AST パターンによって、手作業での確認では見逃されるものを明らかにできます。体系的で、網羅的で、繰り返し実行できるコード分析を実現します。
コメント
Markdown 対応