HUOXIU

コード欠陥検出における大規模モデルの適用事例

出典: Baidu Geek Talk
著者: Xiaoxin、Cherry

導入
導入
静的コード解析(SA)は、ヌルポインタアクセスや配列の範囲外エラーといったコード欠陥を迅速に特定することで、品質を確保し、高いROIで配信効率を向上させることができます。現在のスキャン機能は主に人間の経験から生成されたルールに依存しているため、汎化が弱く、反復処理が遅く、エラーの見逃しにつながっています。本稿では、「機械に何を教えるか」という問いに答えるためにコード知識グラフを、そして「機械がどのように学習するか」という問いに答えるために大規模なコードモデルをベースとしたソリューションを提案します。これにより、コンピュータが人間のようにコードを理解し、欠陥を自動的に発見し、ヒントを提供できるようになり、最終的には人的コストの削減、汎化の向上、そして問題の再現率の向上を実現します。

全文は3,519語から成り、読むのに9分かかると推定されます。


オタクトーク

01

コード欠陥検出の背景紹介

静的コード解析(SA)とは、プログラマーがコードを記述した後、プログラムを実行せずに解析・検査することを指します。テスト前のコーディング段階でSAを導入することで、コードの問題を早期に特定・修正することができ、テスト時間を効果的に短縮し、開発効率を向上させることができます。バグの発見が遅れるほど、修正コストは増大します。

MEGのSA(セルフサービス)機能は2018年に確立され、C++やGoなどの言語をサポートしています。100以上のルールを構築し、MEGのほとんどのモジュールをカバーし、一定レベルのオンライン品質を確保しています。現在、検出は主に手動で生成されたルールに依存しており、手作業による記述コストが高く、汎化能力が弱く、反復処理が遅いため、問題の見逃しにつながるという問題がありました。2022年第2四半期、私たちのチームは大規模モデルの導入を試みました。コードで記述された大規模モデルを使用することで、機械による自律的な欠陥検出を可能にし、汎化能力と反復処理の効率を向上させ、手動でルールを記述するコストを削減します。以下は簡単な紹介です。


オタクトーク

02

ルールベースのコード欠陥検出の主な問題点

欠陥ルールの数が増え、カバーされる言語とモジュールの数が増えるにつれて、2 つの顕著な問題点に早急に対処する必要があります。

1. 各ルールは経験に基づいた手動メンテナンスとその後のエラー分析が必要であり、コストがかかります。例えば、ヌルポインタのシナリオでは、手動で記述されたルールコードは合計4439行で、227件の回帰ケースがメンテナンスされていましたが、それでもQ2には3件のバグが発生しました。開発コストを削減し、効率を向上させるために、大規模なモデルを導入するにはどうすればよいでしょうか?

2. 有効性は比較的低く、スキャン機能にも限界があります(例:リンク切れ、空でない状態を保証するフレームワーク、複雑で静的なシナリオの特定が困難など)。さらに、リスク許容度には個人差があり、ユーザーはリスクの高い問題の修正意欲が低く、ユーザーに不便を強いています。過去の誤検知から学習し、フィルタリングすることで不便さを軽減し、再現率を向上させるために、モデルをどのように活用できるでしょうか?


オタクトーク

03

解決

これら 2 つの問題点を解決するために、対応するソリューションが提案されています。

3.1 大規模モデルに基づく自動欠陥スキャン

コンピュータが人間のようにコードを理解し、欠陥を自動的に検出して強調表示するにはどうすればよいでしょうか? コンピュータが自律的に欠陥検出を実行できるようにするには、2つの主要な技術的課題に対処する必要があります。

[学習内容] コンピュータがより速く、より良く学習できるようにするために、コンピュータにどのようなコンテンツを入力するか。主にコード知識グラフに依存して、ターゲット変数に関連するフラグメントを抽出し、機械学習に必要なサンプルサイズを削減し、学習の精度を向上させます。

【学習方法】 入力内容に関して、どのようなアルゴリズムを用いることで、機械が人間のように複数のプログラミング言語を理解し、検出タスクを完了できるようになるのでしょうか?ディープラーニングの手法が採用されており、主に事前学習と微調整の2つの部分で構成されています。事前学習技術は、大量のラベルなしサンプルから複数の言語に共通するコードセマンティクスを学習することを可能にします。本プロジェクトでは、主にオープンソースの事前学習済み大規模モデルを使用します。微調整技術は、大規模モデルに欠陥検出サンプルを入力することで、シナリオに適応した大規模モデルを取得し、機械が自律的に欠陥を識別できるようにするものです。


3.1.1 コード知識グラフ抽出フラグメント

モデルのパフォーマンスとリソースのバランスをとるため、大規模モデルごとに許容される入力トークンの数は異なります。例えば、BERTモデルでは入力トークンを512個に制限しています。そのため、入力トークンの削減が必要となります。コード知識グラフは、プログラム解析手法に基づいて構築されたホワイトボックス型のソフトウェアコード知​​識ネットワークです。これらの手法では、ビジネスソースコードのあいまいまたは正確な語彙、構文、意味解析に加え、依存関係解析と関係マイニングが行われます。グラフは複数のデータアクセス方法を提供し、ユーザーは低コストでコードデータにアクセスできます。

コードナレッジグラフ機能を活用することで、ターゲット変数やターゲットシナリオに関連するコンテキストに応じたソースコード検索機能を、様々なシナリオに合わせてカスタマイズできます。主な抽出手順は以下のとおりです。

  • 分析されたコードの知識グラフの構築

  • ターゲット変数の検出と識別: 変更されたコード内のターゲット変数を検出対象の変数として識別します。

  • 依存性分析:制御フローとデータフローに基づく対象変数の依存性分析

  • 特徴抽出とプルーニング

ヌルポインタリスク検出を例にとると、最終的なコードスライス情報は次のようになります。


3.1.2 大規模モデル学習アルゴリズムを用いた欠陥予測

大規模モデルの欠陥を検出するには、次の 2 つの方法があります。

1. 1 つの方法は、識別的アプローチを使用して、欠陥があるかどうか、および欠陥の種類を識別することです。

2. 1 つのアプローチは、生成手法を使用してプロンプトを作成し、プログラムが関連するすべての欠陥を自動的にスキャンできるようにすることです。

このプロジェクトでは主に識別的アプローチを採用しており、その実現可能性は実践で実証されています。また、同時実験では生成的アプローチも用いられています。以下のセクションでは、両方のアプローチの実用的な応用例をいくつか紹介します。

3.1.2.1 判別法

分類の概念を用い、モデルに基づいて過去のサンプルからパターンを学習し、新しいサンプルのカテゴリを予測します。TextCNNやLSTMなど、数多くのディープラーニングアルゴリズムの中で、どれを使用すべきでしょうか?複数の比較実験を経て、最終的に最高のパフォーマンスを示したBERTコードモデルを選択しました。

△ モデル効果


BERT を使用した欠陥検出には、事前トレーニング、微調整、推論の 3 つのステップが含まれます。

  • 事前トレーニング段階では、複数のプログラミング言語のセマンティクスを非常によく学習したオープンソースの多言語大規模モデルが使用されます。

  • 微調整フェーズでは、コード知識グラフから抽出された変数のポイント関連スライスと、欠陥の有無や種類を示すラベルがモデルに入力されます。これにより、微調整されたモデルが生成され、機械が検出タスクを実行できるようになります。入力形式:





 { "slices": [{"line":"行コードの内容", "loc": "行番号"}], "mark": {"label":"サンプルラベル", "module_name":"リポジトリ名", "commit_id":"コードバージョン", "file_path":"ファイル名", "risk_happend_line":"例外が発生した行"} } 

  • 推論フェーズでは、使用ポイントにおけるターゲット変数の関連スライスが分析され、モデルを微調整して使用ポイントに欠陥があるかどうか、および欠陥の種類を判別することで予測が行われます。

モデルが起動すると、ユーザーは誤検知や受け入れなど、結果に関するフィードバックを提供します。実際のフィードバックサンプルが収集され、微調整されたモデルの自動学習に組み込まれます。これにより、自動反復と新しい知識の迅速な学習という目標が達成されます。


3.1.2.2 生成法

生成モデルは、クローズドソース(ChatGPTやWenxin Yiyanなど)からオープンソース(Llama、Bloom、Starcodeなど)まで、幅広く普及しています。私たちは主にWenxin Yiyan、Llama、Bloomを用いて実験を行い、プロンプト(少数のショット、思考チェーンの導入、抽象的なガイドラインの指定)と微調整を通して、ヌルポインタ欠陥検出における予測性能を調査しました。全体的にF1スコアは低く、最高の結果であったBloomでも61.69%で、BERTアプローチの80%を下回り、モデルの安定性も低いことが示されました。しかし、生成アプローチには、多数のパラメータがインテリジェントな創発と強力な推論機能につながること、入力トークンの数を増やすことでスライスクリーニングへの依存を減らすことができること、修復技術と組み合わせることができることなど、固有の利点があります。生成アプローチは欠陥検出のトレンドになると予想されます。今後も引き続き最適化を続け、プロンプトの実験や微調整を行い、より適切なガイダンスを通じてモデルの潜在能力を最大限に引き出し、検出シナリオにおける生成方法のパフォーマンスを向上させていきます。

3.2 ルールベースと機械学習を用いた誤報フィルタリング

欠陥検出シナリオで特定された欠陥はリスクであり、受け入れの問題があります。低リスクの欠陥を除外することは困難です。誤検知と修復済みサンプルを分析することで、ポインターの種類、モジュールの誤検知率、ファイルの誤検知率など、誤検知に関連する10以上の特徴量を収集し、フィルタリングが必要かどうかを判断するための機械学習モデル(ロジスティック回帰)をトレーニングします。

ソリューション全体のアーキテクチャ図は次のとおりです。


オタクトーク

04

ビジネスの実装

AIベースのコード欠陥検出機能は、コード管理プラットフォームに統合できます。コードが提出されるたびに、潜在的なコード欠陥を表示してマージプロセスをブロックし、開発者からのフィードバックを収集してモデルの反復処理を促進できます。


オタクトーク

05

メリットと展望

5.1 収益

理論的および実践的な証拠により、コンピューターが自律的にプログラミング言語を学習し、欠陥検出タスクを完了できるようにすることは実現可能であることが示されています。

1. このプロジェクトで使用された手法は、IEEE AITest Conference 2023 で論文として発表されました。

「クロスファンクション ヌル ポインター リスク検出のためのディープラーニング モデルの活用」 (https://ieeeaitest.com/accepted-papers/)

2. 実際の実装結果:2023年第2四半期に、C++のヌルポインターシナリオは1100以上のモジュールをカバーし、662件の問題を修正しました。ルールベースの静的コードスキャンの再現率26.9%と比較すると、増分再現率は484、重複率は26.8%でした。これはAIの再現能力を初めて実証し、大規模モデルによるコード欠陥検出への道を開きました。また、大規模モデルは従来のルールベースの手法と比較して再現率の拡大と低コストという利点があり、ラベル付け+トレーニング+検出の自己完結型ループを形成できることも検証しました。

5.2 展望

セクション5.1で示した利点に基づき、大規模モデルをコード欠陥検出に活用することに自信を持つことができました。今後、以下の分野における取り組みを強化していきます。

1. ゼロ除算、無限ループ、配列の範囲外のシナリオなど、より多くの言語とシナリオに拡張し、Go や Java などの複数の言語で迅速なトレーニングと展開を実施します。

2. 生成モデルの台頭により、有効な問題および修復データが徐々に蓄積され、事前トレーニングおよび微調整用の Wenxin 汎用大規模モデルに貢献し、インテリジェントな欠陥検出および修復の分野での生成モデルの応用を模索します。

3. 同時に、より豊富な効果的なコードスライスを取得して、精度と再現率を向上させるための、より基本的なコードスライス手法を調査します。