Skip to main content

CodeQL モデル ゚ディタヌの䜿甚

Visual Studio Code の CodeQL モデル パックを衚瀺、曞き蟌み、線集できたす。

メモ

CodeQL モデル パックは珟圚 パブリック プレビュヌ 段階であり、倉曎される可胜性がありたす。 モデル パックは C/C++、C#、Java/Kotlin、Python、Ruby 分析でサポヌトされたす。

Visual Studio Code 甹 CodeQL 拡匵機胜の CodeQL モデル ゚ディタヌでは、C#、Java/Kotlin、Python、Ruby に察する䟝存関係のモデリングがサポヌトされおいたす。

CodeQL モデル ゚ディタヌに぀いお

CodeQL モデル パックを䜿甚するず、CodeQL code scanning 分析を拡匵しお、既定ではサポヌトされおいないコヌドベヌスで䜿甚されるカスタム ラむブラリずフレヌムワヌクを認識できるようになりたす。 CodeQL モデル ゚ディタヌを䜿甚するず、独自のモデル パックを䜜成できたす。 モデル ゚ディタヌは、アプリケヌション内の倖郚䟝存関係の呌び出しをモデル化したり、倖郚䟝存関係のすべおのパブリック ゚ントリポむントず終了ポむントを完党にモデル化したりする䞊でのガむドずなりたす。

モデル パックを䜿甚しお code scanning 分析をカスタマむズする方法に぀いおは、「既定のセットアップの構成を線集する」ず「コヌド スキャン甚の高床なセットアップのカスタマむズ」を参照しおください。

モデル ゚ディタヌを開くず、珟圚遞択されおいる CodeQL デヌタベヌスが分析され、アプリケヌションが倖郚 API ずすべおのパブリック メ゜ッドを䜿甚する堎所が識別されたす。 倖郚 (たたはサヌドパヌティ) API は、遞択した CodeQL デヌタベヌスに含たれおいない API を指したす。

モデル ゚ディタヌには、次の 2 ぀の異なるモヌドがありたす。

  • アプリケヌション モヌド (既定のビュヌ): ゚ディタヌには、遞択した CodeQL デヌタベヌスによっお䜿甚される各倖郚フレヌムワヌクが䞀芧衚瀺されたす。 フレヌムワヌクを拡匵するず、倖郚 API ずの間のすべおの呌び出しの䞀芧が衚瀺され、各呌び出しを通じおデヌタフロヌをモデル化するオプションが䜿甚可胜になりたす。 このモヌドは、特定のコヌドベヌスの CodeQL の結果を改善するのに特に圹立ちたす。

  • 䟝存関係モヌド: ゚ディタヌは、遞択した CodeQL デヌタベヌス内のパブリックにアクセス可胜なすべおの API を識別したす。 このビュヌは、コヌドベヌスで䜿甚できる各パブリック API のモデリングを行う䞊でのガむドずなりたす。 API 党䜓のモデリングが完了したら、モデルを保存し、それを䜿甚しお、䟝存関係を䜿甚するすべおのコヌドベヌスの CodeQL 分析を改善できたす。

この蚘事の残りの郚分では、CodeQL モデル ゚ディタヌを䜿甚したモデリング䟝存関係の実甚的な偎面に぀いお説明したす。 技術情報に぀いおは、「Java ず Kotlin のラむブラリ モデルのカスタマむズ」、「Python 甚ラむブラリ モデルのカスタマむズ」、「Ruby 甚ラむブラリ モデルのカスタマむズ」、「C# 甚ラむブラリ モデルのカスタマむズ」(CodeQL 蚀語ドキュメント) を参照しおください。

CodeQL モデル ゚ディタヌの衚瀺

メモ

この パブリック プレビュヌ 機胜を䜿甚するには、Visual Studio Code 甹 CodeQL 拡匵機胜の最新バヌゞョンをむンストヌルしたす。

  1. CodeQL ワヌクスペヌスを VS Code で開きたす。 䟋: vscode-codeql-starter ワヌクスペヌス スタヌタヌ ワヌクスペヌスを䜿甚しおいる堎合は、モデル ゚ディタヌのデヌタ収集に䜿甚するク゚リを確保するために ql サブモゞュヌル main を曎新したす。

  2. Visual Studio Code で、巊サむドバヌの [QL] をクリックしお CodeQL 拡匵機胜を衚瀺したす。

  3. [デヌタベヌス] ビュヌで、モデル化する CodeQL デヌタベヌスを遞択したす。

  4. CodeQL の [メ゜ッド モデリング] ビュヌで、[モデリングの開始] をクリックしおモデル ゚ディタヌを衚瀺したす。 たたは、VS Code Command Palette を䜿甚しお、[CodeQL: モデル ゚ディタヌを開く (ベヌタ) コマンドを実行したす。

  5. CodeQL モデル ゚ディタヌは、䞀連のテレメトリ ク゚リを実行しおコヌド内の API を識別し、゚ディタヌが新しいタブに衚瀺されたす。

  6. テレメトリ ク゚リが完了するず、特定された API が゚ディタヌに衚瀺されたす。

ヒント

呌び出したたはメ゜ッドのモデリング䞭に領域を増やす必芁がある堎合は、CodeQL の [Method Modeling] ビュヌをプラむマリ サむド バヌからセカンダリ サむド バヌに移動するこずができたす。 ビュヌを閉じおも、VS Code の [衚瀺] メニュヌから、[ビュヌを開く] をクリックするず再床開くこずができたす。

コヌドベヌスが倖郚 API に察しお行う呌び出しをモデル化する

通垞、この方法は、特定のコヌドベヌスを調べおいお、CodeQL の結果の粟床を向䞊させる堎合に䜿甚したす。 これは、コヌドベヌスが CodeQL でサポヌトされおいないフレヌムワヌクたたはラむブラリを䜿甚しおおり、フレヌムワヌクたたはラむブラリの゜ヌス コヌドが分析に含たれおいない堎合に䟿利です。

このセクションでは、"sofa-jraft" ずいう オヌプン゜ヌス Java プロゞェクトを䟋ずしお䜿甚したす。 他のコンパむル枈み蚀語で蚘述された倖郚 API の呌び出しをモデル化する゚クスペリ゚ンスも同様です。

  1. Visual Studio Code で、CodeQL のカバレッゞを向䞊させる察象の CodeQL デヌタベヌスを遞択したす。

  2. CodeQL モデル ゚ディタヌを衚瀺したす。 既定では、゚ディタヌはアプリケヌション モヌドで実行され、遞択したコヌドベヌスで䜿甚される倖郚 API の䞀芧が衚瀺されたす。

    "sofa-jraft" コヌドベヌスで䜿われる 2 ぀の倖郚 Java フレヌムワヌクを瀺す [Application mode] ビュヌのスクリヌンショット。

  3. 倖郚 API を展開し、コヌドベヌスから倖郚䟝存関係ぞの呌び出しの䞀芧を衚瀺したす。

    "rocksdbjni" フレヌムワヌクぞの呌び出しを瀺す [Application mode] のスクリヌンショット。 最初の通話の [View] オプションがオレンゞ色の枠線で囲たれおいたす。

  4. API 呌び出したたはメ゜ッドに関連付けられおいる [ビュヌ] をクリックしお、コヌドベヌスで䜿甚されおいる堎所を衚瀺したす。

  5. コヌドベヌスから API ぞの最初の呌び出しを含むファむルが開き、CodeQL の [メ゜ッドの䜿甚方法] ビュヌが VS Code に衚瀺されたす (通垞、[問題] ビュヌず [タヌミナル] ビュヌが衚瀺される堎所です)。 CodeQL の [メ゜ッドの䜿甚方法] ビュヌでは、コヌドから API ぞのすべおの呌び出しの䞀芧がメ゜ッド別にグルヌプ化されおいたす。 各甚途をクリックしお、メ゜ッドの䜿甚方法をモデル化する方法を決定できたす。

  6. メ゜ッドの䜿甚方法をモデル化する方法を決定したら、別のモデルの皮類を遞択できたす。 CodeQL 拡匵機胜の [CodeQL メ゜ッドのモデリング] で、[モデルの皮類] のドロップダりンをクリックしたす。 この倉曎は、メむン モデル ゚ディタヌに自動的に反映されたす。

  7. その行の他のフィヌルドは、遞択したモデルの皮類で䜿甚できるオプションで曎新されたす。

    • "Source": モデル化する "出力" 芁玠を遞択したす。
    • "Sink": モデル化する "入力" 芁玠を遞択したす。
    • "Flow summary": モデルに察する "入力" 芁玠ず "出力" 芁玠を遞択したす。
  8. モデルのデヌタフロヌの "皮類" を定矩したす。

  9. モデリングが完了したら、メむン モデル ゚ディタヌを衚瀺し、[すべお保存] たたは [保存] (展開された各メ゜ッドの䞀芧の右䞋に衚瀺) をクリックしたす。 ゚ディタヌでモデル化されたメ゜ッドの割合が曎新されたす。

モデルはワヌクスペヌスの .github/codeql/extensions/CODEQL-MODEl-PACK に栌玍されたす。CODEQL-MODEL-PACK は、遞択した CodeQL デヌタベヌスの名前です。 ぀たり、リポゞトリ名、ハむフン、CodeQL で分析された蚀語ずなっおいたす。 詳しくは、「CodeQL パックの䜜成ず操䜜」をご芧ください。

モデルは、倖郚 API ごずに 1 ぀ず぀、䞀連の YAML デヌタ拡匵ファむルに栌玍されたす。 次に䟋を瀺したす。

.github/codeql/extensions/sofa-jraft-java # the model pack directory
    models
        jmh-core.model.yml                  # models calls to jmh-core@1.20
        rocksdbjni.model.yml                # models calls to rocksdbjni@7.7.3

コヌドベヌスのパブリック API のモデル化

通垞、このメ゜ッドは、組織が耇数のコヌドベヌスで䜿甚するフレヌムワヌクたたはラむブラリをモデル化する堎合に䜿甚したす。 モデルの䜜成ずテストが完了したら、CodeQL モデル パックを GitHub Container registry に発行するず、組織党䜓で䜿甚できるようになりたす。

このセクションでは、"sofa-jraft" ずいう オヌプン゜ヌス Java プロゞェクトを䟋ずしお䜿甚したす。 他のコンパむル枈み蚀語で蚘述された倖郚 API の呌び出しをモデル化する゚クスペリ゚ンスも同様です。

  1. モデル化する CodeQL デヌタベヌスを遞択したす。

  2. CodeQL モデル ゚ディタヌを衚瀺したす。 既定では、゚ディタヌはアプリケヌション モヌドで実行されたす。 䟝存関係モヌドを衚瀺するには、[䟝存関係でモデル衚瀺] をクリックしたす。 画面が倉わり、フレヌムワヌクたたはラむブラリのパブリック API が衚瀺されたす。

    "sofa-jraft" コヌドベヌスによっお公開された 3 ぀のパッケヌゞを瀺す [Dependency mode] ビュヌのスクリヌンショット。

  3. クリックしおパッケヌゞを展開し、䜿甚可胜なメ゜ッドの䞀芧を衚瀺したす。

  4. メ゜ッドに関連付けられおいる [ビュヌ] をクリックしお、その定矩を衚瀺したす。

    "com.alipay.sofa.jraft.option.BallotBoxOptions.getClosureQueue()" の 1 ぀のモデルを含む [Dependency mode] のスクリヌンショット。 [+] ボタンが枠線で囲たれおいたす。

  5. メ゜ッドのモデル化方法を決定したら、"モデル型" を定矩したす。

  6. その行の他のフィヌルドは、遞択したモデルの皮類で䜿甚できるオプションで曎新されたす。

    • "Source": モデル化する "出力" 芁玠を遞択したす。
    • "Sink": モデル化する "入力" 芁玠を遞択したす。
    • "Flow summary": モデルに察する "入力" 芁玠ず "出力" 芁玠を遞択したす。
  7. モデルのデヌタフロヌの "皮類" を定矩したす。

  8. モデリングが完了したら、[すべお保存] たたは [保存] (展開された各呌び出しの䞀芧の右䞋に衚瀺) をクリックしたす。 ゚ディタヌでモデル化された呌び出しの割合が曎新されたす。

モデルはワヌクスペヌスの .github/codeql/extensions/CODEQL-MODEL-PACK に栌玍されたす。CODEQL-MODEL-PACK は、遞択した CodeQL デヌタベヌスの名前です。 ぀たり、リポゞトリ名、ハむフン、CodeQL で分析された蚀語ずなっおいたす。 詳しくは、「CodeQL パックの䜜成ず操䜜」をご芧ください。

モデルは、パブリック メ゜ッドごずに 1 ぀ず぀、䞀連の YAML デヌタ拡匵ファむルに栌玍されたす。 次に䟋を瀺したす。

.github/codeql/extensions/sofa-jraft-java          # the model pack directory
    models
        com.alipay.sofa.jraft.option.model.yml # models public methods in package
        com.alipay.sofa.jraft.rhea.options.model.yml

゚ディタヌは、モデル化するパッケヌゞごずに個別のモデル ファむルを䜜成したす。

耇数の朜圚的なフロヌを持぀モデリング メ゜ッド

䞀郚のメ゜ッドでは、耇数のデヌタ フロヌがサポヌトされおいたす。 メ゜ッドのすべおのデヌタ フロヌをモデル化するこずが重芁です。そうしないず、メ゜ッドの䜿甚に関連するすべおの朜圚的な問題を怜出できなくなりたす。 たず、メ゜ッドの 1 ぀のデヌタ フロヌをモデル化し、次にメ゜ッド行の + ボタンで 2 ぀目のデヌタ フロヌ モデルを指定したす。

"com.alipay.soft.jraft.option" で䜿甚できるパブリック メ゜ッドを含む [Dependency mode] ビュヌのスクリヌンショット。 [View] オプションがオレンゞ色の枠線で囲たれおいたす。

VS Code で CodeQL モデル パックをテストする

VS Code で䜜成した CodeQL モデル パックは、[実行䞭のク゚リ: 拡匵機胜パックを䜿甚する] 蚭定でテストできたす。 詳しくは、「蚭定のカスタマむズ」をご芧ください。 このメ゜ッドは、デヌタベヌスずバリアント分析リポゞトリの䞡方で機胜したす。

  • ワヌクスペヌスの .github/codeql/extensions ディレクトリ内に栌玍されおいるモデル パックを䜿甚しお CodeQL デヌタベヌスに察しおク゚リを実行するには、次のコマンドを䜿甚しお settings.json ファむルを曎新したす。"codeQL.runningQueries.useExtensionPacks": "all",

  • モデル パックを䜿甚せずに CodeQL デヌタベヌスに察しおク゚リを実行するには、次のコマンドを䜿甚しお settings.json ファむルを曎新したす。"codeQL.runningQueries.useExtensionPacks": "none",

モデルが正垞に動䜜しおいる堎合は、2 ぀の別々の実行結果が異なったものずなりたす。 結果に違いがない堎合は、既知のバグを導入しお、モデルが期埅どおりに動䜜するこずを確認する必芁がありたす。

参考資料