コード欠陥検出分野における大規模モデルの応用実践

著者 | Xiaoxin、Chelizi

導入 

静的コード スキャン (SA) は、ヌル ポインター アクセス、配列の境界外などのコードの欠陥を迅速に特定し、品質を確保し、より高い ROI で配信効率を向上させます。現在のスキャン機能は主に人為的な経験に依存してルールを生成していますが、一般化能力が弱く、反復に遅れが生じ、漏れが発生します。この記事では、コードナレッジグラフに基づいて機械が何を学習するかという問題を解決し、コンピューターが人間と同じようにコードを理解できるように、大規模なコードモデルに基づいて機械がどのように学習するかという問題を解決することを提案します。より良い結果を達成するために、コード内の欠陥を自動的に検出し、ヒントを提供します。少ない人件費で、より効果的な汎化と、より高い問題再現を実現します。

全文は 3519 ワード、推定読了時間は 9 分です。

01 コード欠陥検出の背景概要

静的コード スキャン (SA) とは、ソフトウェア エンジニアリングにおいて、プログラマーがソース コードを作成した後、コンピューター プログラムを実行せずにプログラムを分析およびチェックすることを意味します。コードテスト前のコーディング段階でSAを介入させることで、コードの問題点を事前に発見・修正することができ、テスト時間の効果的な短縮と研究開発効率の向上を図ることができ、バグの発見が遅くなるほど修正コストが増大します。

写真

MEG の SA 機能は 2018 年に確立されました。C++、GO、その他の言語をサポートし、MEG のモジュールのほとんどをカバーする 100 以上のルールを構築し、オンライン品質をある程度保証します。現在の検出は主に手動で生成されたルールに依存しているため、手動での作成コストが高く、汎化機能が弱く、反復の遅れが生じ、問題の漏洩につながります。2022 年の第 2 四半期に、私たちのチームは大規模モデルの導入を試みる予定です。コード言語の大規模モデルを通じて、マシンは自律的に欠陥を検出し、汎化機能と反復効率を向上させ、手動でルールを作成するコストを削減できます。続いて、関連するご紹介をさせていただきます。

02 ルールベースのコード欠陥検出における主な問題

欠陥ルールが増加し、対象となる言語とモジュールが増加するにつれて、早急に解決する必要がある 2 つの未解決の問題点が存在します。

1. 各ルールは経験に基づいた手動メンテナンスとその後のリーク分析が必要であり、コストがかかります。ヌル ポインター シナリオを例に取ると、手動で作成されたルール コードは合計 4,439 行で、合計 227 の回帰ケースが維持されますが、第2四半期はまだ3 バグがリークしました。開発コストを削減し、品質と効率を向上させるために大規模なモデルを導入するにはどうすればよいでしょうか?

2. 効率が低く、スキャン機能が制限されているため (リンク切れ、空ではないフレームの保証、静的で複雑なシーンの識別が困難など)、リスクの許容度が異なります。スキャンされた高リスクの問題の一部は、モデルを使用して過去の誤検知から学習し、それらをフィルタリングし、中断を減らし、再現率を向上させるにはどうすればよいでしょうか?

03 ソリューション

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

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

コンピュータに人間と同じようにコードを理解させ、コード内の欠陥を自動的に見つけてプロンプトを表示させる方法。コンピューターが独立して欠陥を検出できるようにするには、次の 2 つの主要な技術的問題を解決する必要があります。

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

【学習方法】入力内容に基づいて、機械が人間と同じように複数のプログラミング言語を読み、検出タスクを完了するにはどのようなアルゴリズムを使用する必要があるか?主に事前トレーニングを含むディープラーニング手法が使用されますそして微調整。事前トレーニング テクノロジを使用すると、コンピューターは大量のラベルのないサンプルから複数の言語で共通のコード セマンティクスを学習できます。このプロジェクトでは、主にオープンソースの事前トレーニングされた大規模モデルが使用されます。微調整テクノロジーにより、欠陥検出サンプルを大規模モデルに入力して、シーンに適応する大規模モデルを取得し、機械が独立して欠陥を識別できるようにします。

写真

3.1.1 コードナレッジグラフ抽出フラグメント

モデルのパフォーマンスとリソースのバランスをとるために、大規模なモデルごとに異なる入力トークンの大きさが許可されます。たとえば、Bert モデルでは 512 トークンが制限されているため、入力を減らす必要があります。コード ナレッジ グラフは、ビジネス ソース コードのあいまいまたは正確な字句分析、構文分析、意味分析を実行し、依存関係分析、関係マイニングなどの手段と組み合わせた後、プログラム分析手法に基づいて構築されたソフトウェア ホワイトボックス コード ナレッジ ネットワークです。Graph はさまざまなデータ アクセス方法を提供し、ユーザーが低コストでコード データにアクセスできるようにします。

コード ナレッジ グラフ機能の助けを借りて、ターゲット変数またはターゲット シナリオに関連するさまざまなコンテキスト ソース コード取得機能を、さまざまなシナリオに従って定式化できます。抽出の主な手順は次のとおりです。

  • 分析されたコードのナレッジ グラフを構築する

  • 対象変数の検出と特定: 変更されたコード内の対象変数を検出対象の変数として特定します。

  • 変数の依存関係分析:制御フローとデータフローに基づいた対象変数に関連する依存変数の分析

  • 特徴文の抽出と枝刈り

写真

Null ポインターのリスク検出を例として、最終的に次のサンプル コードのスライス情報を取得します。

写真

3.1.2 欠陥予測に大規模モデル学習アルゴリズムを使用する

大規模モデルの欠陥を検出するには 2 つのアイデアがあります。

1. 1 つは、判別法によって欠陥の有無と欠陥の種類を識別する方法です。

2. 1 つは、生成的な方法を使用してプロンプトを作成し、プログラムに関連するすべての欠陥を自動的にスキャンさせる方法です。

本プロジェクトでは主に判別法を採用しており、この手法が実用上一定の実現可能性があることを証明した。生成手法の同期実験では、2 つのアイデアの実践例を以下に紹介します。

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 や Wen Xinyiyan などのクローズド ソース モデルや、llama、bloom、starcode などのオープン ソース モデルを含めて盛んです。私たちは主に Wen Xinyiyan、llama、bloom を試し、プロンプト (少数のショット、思考チェーンの導入、抽象的なガイダンス ルールの指定) と微調整を通じてヌル ポインターの欠陥検出におけるモデルの予測効果を調査しました。全体的な f1 測定値は高くなく、最高ブルームは 61.69% で、Bert ルートの 80% に遠く及ばず、モデルの安定性も劣ります。生成ルートには、パラメーターの数が多い、インテリジェントな創発性、より強力な推論能力などの独自の利点があるため、入力トークンの量が増加し続けることができ、スライスのクリーニングへの依存を軽減でき、修復と組み合わせることができます。検出シナリオの生成手法がトレンドになっている 次に、最適化を継続し、常にプロンプ​​トと微調整を試み、より適切なガイダンスによってモデルの可能性をより良く刺激し、改善していきます検出シナリオにおける生成手法の効果。

写真

3.2 ルールと機械学習を使用して誤検知をフィルタリングする

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

全体的なプログラム アーキテクチャ図は次のとおりです。

写真

04 事業実施

AI ベースのコード欠陥検出機能をコード管理プラットフォームに統合できます。コードが送信されるたびに、コードの欠陥の可能性が表示され、統合がブロックされ、モデルの反復を容易にするために開発者からのフィードバックが収集されます。

05 業績と見通し

5.1 収益

理論と実践を通じて、コンピューターにプログラミング言語を独自に学習させ、欠陥検出タスクを完了させることが可能であることが証明されました。

1. このプロジェクトの手法は、IEEE AITest Conference 2023 で公開されています。

《深層学習モデルを活用した機能横断的な Null ポインター リスク検出》( https://ieeeaitest.com/accepted-papers/ )

2. 実際の実装効果: 2023Q2 C++ Null ポインタ シナリオは 1100 以上のモジュールをカバーし、662 件の問題が修正されました。通常の静的コード スキャン リコールと比較して、リコールは 26.9%、増分リコールは 484、重複度は 26.9% でした。 AI のリコール機能により、コード欠陥検出のための大規模モデルへの扉が開かれ、大規模モデルには従来のルールの拡張されたリコールと低コストという利点があり、自己閉ループを形成できることも検証されています。マーキング + トレーニング + 検出。

5.2 展望

5.1 の利点に基づいて、コード欠陥検出に大規模なモデルを安心して使用できるようになりました。今後も次の点で強化していきます。

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

2. 生成モデルの台頭により、効果的な問題と修復データが徐々に蓄積され、Wenxin の一般的な大規模モデルが事前トレーニングと微調整に提供され、インテリジェントな欠陥検出と分野での生成モデルの応用が模索されます。修理;

3. 同時に、より基本的なスライシング技術を研究し、より豊富で効果的なコードスライシングを取得して、呼び出しの精度を向上させます。

- 終わり -

推奨読書

Python スクリプトによる OC コード再構築の実践のサポート (2): データ項目はモジュール アクセス データ パスのコード生成を提供します

Baidu のオープンソース高性能検索エンジン Puck について InfoQ に相談してください

検索プレゼンテーション層のシナリオ技術に関する簡単な説明 - TanGo の実践

初めての検索入門: Baidu 検索プロダクト マネージャーの最初のレッスン

Baidu 検索におけるインテリジェントな質問と回答技術の応用

Alibaba Cloudが深刻な障害に見舞われ、全製品が影響(復旧) Tumblr がロシアのオペレーティングシステムAurora OS 5.0 を冷却新しいUIが公開 Delphi 12とC++ Builder 12、RAD Studio 12多くのインターネット企業がHongmengプログラマーを緊急採用UNIX時間17 億時代に突入しようとしている (すでに突入している) Meituan が兵力を募集し、Hongmeng システム アプリの開発を計画Amazon が Linux 上の .NET 8 への Android の依存を取り除くために Linux ベースのオペレーティング システムを開発独立した規模はFFmpeg 6.1「Heaviside」がリリースされまし
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4939618/blog/10140696