コード検査プロセスにコンパイルを含める必要があるのはなぜですか?

この記事は、Huawei Cloud Community  「なぜコンパイルがコード検査プロセスに関与する必要があるのか​​?」から共有されたものです。"、著者:gentle_zhou。

誰もがソフトウェアのセキュリティにますます注目するようになり、コーディング段階でのソース コードのセキュリティの保護についても、あらゆる分野の企業の研究開発、テスト、運用、保守のチームや個人の開発者によって頻繁に言及されるようになりました。静的コード検査 SAST ツールが特に顕著です。

SAST コード検査サービスは、ソース コードの品質 (スタイルを含む)、セキュリティ、仕様などをチェックし、コード内の欠陥やリスクを検出できるツールです。誰もがツールを徹底的に使用するため、多くの友人が使用中に混乱し、ソースコードを確認するだけで同意していませんでしたか? なぜコンパイルが関係するのでしょうか? ローカル環境ではコンパイルが成功するのに、クラウド環境に置くとコンパイルに失敗したと表示されるのはなぜですか?

この記事では、友人がプロセスと原則を理解できるように、上記の問題を一つずつ説明しようとします。

1. ソースコードのみをチェックすることに同意していませんか? なぜコンパイルが関係するのでしょうか?

一般的に言えば、はい、SAST 静的コード インスペクションは静的なアプリケーション セキュリティ テスト テクノロジであり、通常、コードがコンパイルされる前に実行されます。つまり、SAST ツールは、使用前にコードの実行や実行を強制しません。 . ソースコードそのものを対象とし、コードの構文、構造、ロジックなどを解析できます。

ただし、これは、SAST ツールがコンパイルとまったく関係がないことを意味するわけではありません。実際、必要に応じて、SAST ツールは、コンパイルおよび構築ツールを使用してコードをコンパイルし、生成されたコンパイル製品を分析してコードを分析する必要もあります。コードのセマンティクスとロジックを理解して、より深い理解と分析を行うことができます。

2. コンパイルの一般的なプロセスは何ですか?

編集プロセスについて話す前に、まずいくつかの固有名詞について理解しましょう。

AST (抽象構文ツリー) は、プログラム コードの構造を表すために使用されるツリー状のデータ構造で、コードの構文とロジックを反映できます。AST は、構文チェック、コード スタイル チェック、フォーマットされたコード、構文の強調表示、エラー プロンプト、自動補完などに使用できます。

cke_114.png

IR (中間表現) は、プログラム コードのセマンティクスを表現するために使用されるデータ構造であり、さまざまなプログラミング言語のコードを共通の形式に変換して、分析と最適化を容易にすることができます。

cke_115.png

CFG (コントロール フロー グラフ) は、プログラム コードの実行フローを表現するために使用されるグラフィカル データ構造で、コードを基本ブロックに分割し、エッジを使用して基本ブロック間のジャンプ関係を表現できます。

cke_116.png

上記の 3 つの専門名詞は、コード検査プロセス中にツールがコードのセマンティクスとロジックをよりよく理解して処理できるようにする役割を果たし、分析の精度の向上に役立ちます。

要点に戻りましょう。SAST コード チェック ツールのコンパイル プロセスではどのようなプロセスが実行されるのでしょうか? 一般的に、完全なコンパイル プロセスは、ソース コードの構文、語彙、セマンティクスの分析、AST の生成、IR への変換、CFG の生成、データ フローの分析と最適化、ターゲット コードの生成を経ます。

したがって、SAST コード検査はコンパイルから完全に独立しているわけではなく、詳細な分析を支援するために、ある程度までコンパイルおよび構築ツールに依存する必要があります。

3. ローカル環境ではコンパイルが成功するのに、クラウド環境に置くとコンパイルが失敗するのはなぜですか?

この時点で、SAST ツールでコンパイル操作が使用されていることはほとんどの友人が理解していると思いますが、使用中にスキャンが失敗する場面がまだあると思います。最も典型的なのは、サブタイトルにある「なぜ」の問題です。ローカルのコンパイルは成功しましたが、クラウド環境のチェックに入れるとコンパイルに失敗したと表示されますか?

具体的には、大きく以下のような理由が考えられます。

  • 最も一般的なのは、ローカル環境では、プロジェクトがローカルに保存されたプライベートな依存関係や構成を参照することです。クラウド環境では、SAST コンパイル プロセス中にこれらの依存関係または構成が見つからず、コンパイルは失敗します。
  • ユーザーのプロジェクト自体がコンパイルされたプロジェクトではないか、プロジェクトはコンパイルされたプロジェクトであっても、プロジェクト内で正しく構成されていません。たとえば、よく発生する問題は、ユーザーがプロジェクトを引き継いで、それがコンパイルされたプロジェクトであるという情報を取得するだけで、実際にはプロジェクトにコア構成ファイルが含まれていないということです。たとえば、コア構成ファイル pom.xml は次のとおりです。 Maven プロジェクトにありません。
  • クラウド SAST ツールのチェック コンパイル パラメーターが正しく選択されていません。たとえば、ユーザーのプロジェクトは Maven プロジェクトですが、ユーザーはそれを Gradle プロジェクトであると誤って認識し、クラウド内のコンパイル ツールとして Gradle を選択します。別の例として、C# プロジェクトの msbuild コンパイル プロジェクトで、間違ったバージョンの .net Framework が選択されました (4.8 ではなく 3.5 が選択されました)。
  • ユーザーのプロジェクト コードに文法エラーまたは型エラー (スペル エラー、セミコロンの欠落、型の不一致など) があります。ローカル環境では、IDE ヘルプが自動的に修正するか、ローカル コンパイラがチェックしません。クラウド SAST ツールは、より厳格なコンパイラまたは高レベルのコンパイラを使用するため、コンパイルが失敗します。
  • ユーザーのプロジェクトには、ラムダ式、リスト内包表記などの特別な言語機能または構文糖がいくつかあります。ローカル コンパイラはこれらの機能をサポートしていますが、クラウド SAST ツールは、これらの機能をサポートしていないコンパイラまたは下位の言語バージョンを使用します。コンパイルが失敗する原因となります。

もちろん、SAST ツールが異なれば、使用するスキャン方法やテクノロジーも異なるため、コンパイル方法も異なり、コンパイル環境への依存度も異なります。

参考文献

1. https://en.wikipedia.org/wiki/Abstract_syntax_tree

2、https://www.twilio.com/blog/abstract-syntax-trees

3、https://www.cs.princeton.edu/courses/archive/spr03/cs320/notes/IR-trans1.pdf

4、https://gcc.gnu.org/onlinedocs/gccint/Control-Flow.html#: ~:text=コントロール フロー グラフ (CFG) は、コンパイルされる関数のデータ、動作です。

5、https://www.csl.cornell.edu/ ~zhiruz/5997/pdf/lecture04.pdf

 

クリックしてフォローし、できるだけ早くHuawei Cloudの新しいテクノロジーについて学びましょう~

 

200元の罰金と100万元以上を没収 You Yuxi: 高品質の中国語文書の重要性 MuskのJDK 21用ハードコア移行サーバー Solon、仮想スレッドは信じられないほど素晴らしい! TCP 輻輳制御によりインターネットが節約される OpenHarmony 用の Flutter が登場 Linux カーネルの LTS 期間が 6 年から 2 年に復元される Go 1.22 で for ループ変数エラーが修正される Svelte は「新しいホイール」を作成 - ルーン文字 Google が創立 25 周年を祝う
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4526289/blog/10114610