[Code Quality] Semgrepを使って正規表現でコードを検査する

2025-01-11 hit count image

Semgrepを使って正規表現でコードを検査してコードの’品質を向上させる方法について説明します。

概要

開発をする時、コードの品質を高めるためにLintなどの静的解析ツールを使います。しかし、静的解析ツールは一般的なルールしか提供せず、すべてのルールを提供しません。そのため、静的解析ツールが提供していないルールをコード検査に追加したい場合は、Lintのカスタムルールを追加して使ったりします。

このように追加したカスタムルールはLintの対象となるコードだけ検査が可能ですが、コメントなどの部分は検査を行えない場合があります。このような場合、Semgrepを使って正規表現を使ってカスタムルールを作成することができます。

Semgrep

Semgrepはコードの安全性、品質、スタイルを自動で検査して改善するための静的解析ツールです。主にソースコードを解析してセキュリティ脆弱性、バグ、コード品質の問題を見つけるのに使われます。

Semgrepはユーザー定義ルールを正規表現パターンで書くことができます。これを使うとLintなどの静的解析ツールでは検査が難しい部分を検査することができます。

今回のブログポストでは、Semgrepを使って正規表現でコードを検査する方法について説明します。

Semgrepのインストール

SemgrepはPythonで動作するため、基本的にPythonがインストールされている必要があります。各OSにPythonをインストールする方法は省略します。

SemgrepはPythonパッケージとしてインストールすることができます。Semgrepをインストールするために次のコマンドを実行します。

pip install semgrep

インストールしたら、他の場所でも使えるようにrequirements.txtを作成します。

pip freeze > requirements.txt

requirements.txtを開くと、次のような内容が追加されていることを確認できます。

semgrep==1.97.0

このrequirements.txtを使って、他の場所でSemgrepをインストールするためには次のコマンドを使います。

pip install -r requirements.txt

Semgrepルールの設定

次は、Semgrepを使って正規表現でコードを検査するためのコードルールを作成してみます。まず、code-rules.yamlファイルを作成し、次の内容を書きます。

rules:
  - id: missing-param-description
    severity: ERROR
    message: 【Comment error】 Add correct comment.
    languages:
      - javascript
      - typescript
    patterns:
      - pattern-regex: \*\s*@.*-\s*(\n|\r\n|$)

このルールは次のような内容を検査します。

❌ Incorrect

次のようにコメントを書いていないまま-を残している場合、エラーが発生します。

  /**
   * Add two numbers
   * @param {number} a - number for addition
   * @param {number} b -
   * @returns {number}
   */

✅ Correct

次のようにすべてのコメントが書かれている場合、エラーは発生しません。

  /**
   * Add two numbers
   * @param {number} a - number for addition
   * @param {number} b - number for addition
   * @returns {number}
   */

Semgrepの実行

次はSemgrepを使ってコードを検査してみましょう。次のコマンドを実行すると、Semgrepがコードを検査して結果を出力します。

semgrep --config=code-rules.yaml --error

このコマンドを実行すると、次のような結果が確認できます。


┌──── ○○○ ────┐
│ Semgrep CLI │
└─────────────┘


Scanning 7035 files (only git-tracked) with 1 Code rule:

  CODE RULES
  Scanning 5089 files.

  SUPPLY CHAIN RULES

  No rules to run.


  PROGRESS

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00


┌──────────────────┐
│ 93 Code Findings │
└──────────────────┘

    apps/sample/view/index.ts
   ❯❯❱ missing-param-description
          【Comment error】 Add correct comment.

           12┆ * @param {Params} params -
           13┆ * @return {number}
...

GitHub Actions

このように設定したSemgrepを使って、GitHub Actionsでコードを検査することができます。.github/workflows/semgrep.ymlファイルを作成し、次の内容を書きます。

name: Check code by Semgrep

on:
  pull_request:

jobs:
  semgrep:
    name: Check code by Semgrep
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: actions/setup-python@v5
        with:
          python-version: '3.13'
          cache: 'pip'
      - run: pip install -r requirements.txt
      - name: Run Semgrep
        run: |
          semgrep --config=code-rules.yaml --error

これでGitHub ActionsでPRを作成すると、次のようなエラーが発生することが確認できます。

Run semgrep --config=code-rules.yaml --error
METRICS: Using configs from the Registry (like --config=p/ci) reports pseudonymous rule metrics to semgrep.dev.
To disable Registry rule metrics, use "--metrics=off".
Using configs only from local files (like --config=xyz.yml) does not enable metrics.

More information: https://semgrep.dev/docs/metrics



┌─────────────┐
│ Scan Status │
└─────────────┘
  Scanning 7034 files tracked by git with 1 Code rule:
  Scanning 5087 files.


┌──────────────────┐
│ 93 Code Findings │
└──────────────────┘

    apps/agencyTool/src/feature/AdminStaffDetailDialog/controller/actions/initialize/index.ts
   ❯❯❱ missing-param-description
          【Comment error】 Add correct comment.

           12┆ * @param {Params} params -
           13┆ * @return {number}
...

完了

以上で、Semgrepを使って正規表現でコードを検査する方法について説明しました。Semgrepを使うと、Lintなどの静的解析ツールでは検査が難しい部分を検査することができます。

コードレビューで同じ問題が繰り返し指摘されている場合は、まずESLintなどの静的解析ツールにその問題に関するルールがあるかどうかを調べ、ある場合はそのルールを追加します。

もし、そのルールがなく、その問題が定型化されたパターンを持っている場合は、Semgrepを使って正規表現でコードを検査する方法を試してみてください。

このブログポストがSemgrepを使ってコードの品質を向上させるのに役立てば幸いです。

私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!

アプリ広報

今見てるブログを作成たDekuが開発したアプリを使ってみてください。
Dekuが開発したアプリはFlutterで開発されています。

興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。

Posts