paint-brush
コード品質を向上させるための効果的な静的コード分析手法@launchable
27,156 測定値
27,156 測定値

コード品質を向上させるための効果的な静的コード分析手法

Launchable7m2023/03/09
Read on Terminal Reader

長すぎる; 読むには

静的コード分析とは、ソース コードを実行せずに問題がないか分析することを意味します。これは、実行可能ファイルを起動して正しい動作を検証する動的コード テストとは対照的です。 3 つの手法には、構文分析、データと制御フローの分析、およびセキュリティ分析が含まれます。さまざまなタイプの静的分析とその効果を高める方法について詳しく学びましょう。
featured image - コード品質を向上させるための効果的な静的コード分析手法
Launchable HackerNoon profile picture

予測テストの選択を重ねることで静的コード分析の有効性を増幅する方法

コンピュータ プログラミングは、パンチ カードの全盛期から長い道のりを歩んできました。プログラマーが紙のカードに穴を開け、正しいかどうかを 3 回チェックし、最終的にプログラムを実行したときにそれが機能することを期待して、手動でタスクをプログラムした時代は終わりました。


コンピューター


現在、開発者は、コード エディターに入力した瞬間にコード行の正確さに関するフィードバックを得ることができます。これは、静的コード分析の分野におけるイノベーションのおかげで、パンチ カード開発プロセスとはかけ離れています。


静的コード分析は、ソフトウェア開発プロセスの早い段階で問題を特定して防止できますが、リソースを消費するリスクがないわけではありません。静的コード分析は、ソフトウェアの品質と信頼性を向上させるための貴重なツールになる可能性がありますが、テスト影響分析を実行し、予測テストの選択を追加することで価値を高めることができます。


静的コード分析とは、ソース コードを実行せずに問題がないか分析することを意味します。これは、実行可能ファイルを起動して正しい動作を検証する動的コード テストとは対照的です。


静的アナライザーは、アルゴリズムとルールセットを使用して潜在的な問題を特定し、重大度と影響に基づいて分類し、問題を開発者に渡してトリアージと解決を依頼します。

さまざまな種類の静的分析と、予測テストの選択を重ねることでその効果を高める方法について詳しく学びましょう。

静的コード分析手法の概要

静的コード分析手法を使用して、コードを展開する前にコードの潜在的な問題を特定し、開発者が変更を加えてソフトウェアの品質を向上できるようにします。 3 つの手法には、構文分析、データと制御フローの分析、およびセキュリティ分析が含まれます。

構文解析

構文解析には、括弧の欠落、無効な変数名、不適切なインデントなど、構文エラーやコーディング標準違反がないかコードをチェックすることが含まれます。最近のほとんどの IDE には、構文解析が組み込まれています。たとえば、Visual Studio と Visual Studio Code には、コード分析が Intellisense 機能に組み込まれています。以下のスクリーンショットでは、Visual Studio 2022 は、コードがコンパイルされる前に、セミコロンがないという C# 構文エラーを表示しています。

構文エラー

構文解析は、開発者が「実行」ボタンを押す前にバグを発見するのに役立ちます。

データと制御フローの分析

この手法では、初期化されていない変数、null ポインター、データ競合状態などの潜在的な問題を特定するために、コードを介したデータの流れを追跡します。制御フロー分析も同様で、無限ループや到達不能コードなどのバグを特定するのに役立ちます。最新のコンパイラの多くには、データ フロー分析と制御フロー分析が組み込まれています。それらは、コンパイル時の警告またはエラーとして検出結果を明らかにします。


たとえば、C 言語ファミリの Clang ツールセットは、コンパイル中にフロー分析を自動的に実行します。 Python などのコンパイルされていない言語の場合、 CodeQLなどのデータおよび制御フロー分析ツールを手動で使用できます。

セキュリティ分析

セキュリティの静的分析には、バッファ オーバーフロー、クロスサイト スクリプティング、インジェクション攻撃など、潜在的なセキュリティの脆弱性がないかコードをチェックすることが含まれます。また、サード パーティの依存関係をスキャンして、既知の脆弱性があるパッケージを探し、ソース コードにチェックインされた資格情報を検出することもできます。


静的アプリケーション セキュリティ テスト (SAST) ツールには次のものがあります。

例: SemGrep を使用した静的アプリケーション セキュリティ テスト

SemGrep は、人気のある無料のアプリケーション セキュリティ静的分析ツールです。 OWASP Juice Shopのような安全でないコードを含むプロジェクトで SemGrep のセキュリティ アナライザーを実行すると、コードに多数のセキュリティ脆弱性が見つかります。


急行連続注射

静的コード分析の利点: 品質、防止、コスト

  1. コードの品質と信頼性の向上。静的分析は、問題を早期に発見するのに役立つため、開発者を強化します。その結果、より優れた信頼性の高いコードが得られます。
  2. 問題の早期発見と予防。すでに顧客の問題を引き起こしているときにバグを見つけるのではなく、コードを初めて実行する前に静的分析を行うことでバグを見つけることができます。
  3. 効率の向上とコスト削減。開発者が静的分析で問題を早期に発見できれば、CI/CD スイートでテストを再実行し続ける必要はありません。これにより、クラウド コンピューティングのコストが節約され、開発サイクルが加速されます。

静的コード分析を使用する際の課題と考慮事項

静的コード分析は、チームが問題を早期に発見するのに役立ちますが、完全なアプローチではなく、誤検知や誤検知が発生する可能性があり、ツールセットによって制限されます。

偽陽性

開発者に静的分析ツールの何が嫌いなのかを尋ねると、1 つの答えが何度も返ってきます: 誤検知です。


静的アナライザーは、ヒューリスティックとルールセットを使用して、コード行の結果を判断します。ただし、それらは完全ではなく、実際にはコンテキストで発行されていない結果が頻繁に表示されます。


次のコード行の例:

 // Set the password policy so that user passwords expire after 365 days. passwordExpiry = 365;


単純なセキュリティ スタティック アナライザーは、文字列「password」を認識し、これをソース コード内の資格情報としてフラグ付けします。調べてみると、明らかに秘密ではなく、コードを変更する必要はありません。この問題を調査して誤検出としてフラグを立てるには、余分な開発時間が必要であり、イライラする可能性があります。

偽陰性

ソフトウェア コードは複雑になる可能性があり、静的アナライザーは状況のニュアンスを見逃す可能性があります。したがって、静的アナライザーに頼って、作成したバグを 100% 見つけることはできません。

クラウド環境には、 serverprod.config (本番) とservertest.config.dev (テスト環境) という 2 つのほぼ同一のサーバー構成ファイルがあります。


静的アナライザーは、ファイル拡張子が.configのファイルをスキャンし、 serverprod.configの問題を正しく検出するように構成されていますが、ファイル名のパターンと一致しないため、 servertest.config.devファイルの同じ問題を見逃しています。

複数のツールとアプローチの使用

すべてを実行できる単一の静的分析ツールはありません。多くは、さまざまな環境、ファイルの種類、およびスキャンの種類に特化しています。組織では、セキュリティ スキャン用の 1 つのツール、Typescript フロントエンド用の別のツール、Golang バックエンドをスキャンするための 3 つ目のツール、さらにサーバー構成の Terraform ファイル用の別の静的アナライザーが必要になる場合があります。各ツールは価値を提供しますが、それらすべてをセットアップして維持するのは面倒な場合があります。

静的コード分析ツール

静的コード分析の主なツールの一部を次に示します。

  1. SonarQube : 幅広いプログラミング言語をサポートし、さまざまなビルドおよびデプロイ ツールと統合する、人気のあるオープン ソースの静的コード分析ツールです。


  2. Checkstyle : Java コードのコーディング スタイルと規約違反をチェックするオープンソースの静的コード分析ツール。


  3. FindBugs : パフォーマンスの問題、セキュリティの脆弱性、コーディング標準違反など、Java コードの潜在的な問題を特定するオープンソースの静的コード分析ツール。


  4. PMD : Java、C++、Python など、さまざまなプログラミング言語の問題をチェックするオープンソースの静的コード分析ツール。


  5. Veracode : ソフトウェアのセキュリティ脆弱性を特定して対処するためのさまざまな機能を提供する、商用の静的コード分析ツールです。


  6. Coverity : コード内のセキュリティ上の欠陥の特定と防止に重点を置いた商用の静的コード分析ツール。


  7. ESLint : JavaScript コードの問題を見つけて修正するためのオープンソース プロジェクト。 TypeScript を使用している場合は、typescript-eslint バリアントを確認してください。


これらのツールは、さまざまな機能を提供し、さまざまなプログラミング言語をサポートし、さまざまな種類のソフトウェア ライセンスを持っています。静的コード分析ツールを選択する際には、ライセンスと組織の特定のニーズと要件を考慮することが重要です。

例: ESLint を使用した JavaScript 静的コード分析

ESLint を使用した JavaScript 静的コード分析の簡単な例を次に示します。


JavaScript 静的コード


この 1 行のコードには、ESLint がすぐに見つけられる 2 つの問題があります。


  1. 文字列は二重引用符を使用する必要があります
  2. 変数に値が割り当てられますが、使用されることはありません。


静的コード分析を通じてこれらの問題を特定して対処することにより、組織はソフトウェアの品質と信頼性を向上させることができます。 ESLint を自分で試してみませんか? ESLint Playground をオンラインで使用できます。

静的コード分析と予測テストの選択

Predictive Test Selection は 、機械学習を使用して過去のテスト結果を分析し、将来失敗する可能性が高いテストを予測する手法です。これを静的コード分析と組み合わせて使用することで、テスト プロセスの効率と有効性を向上させることができます。

静的分析は、ソフトウェア品質戦略の 1 つの側面にすぎません。


ほとんどの組織は、静的分析を使用して、機能的なエンド ツー エンドのソフトウェア テストを強化しています。静的分析テストは、CI/CD パイプラインで実行される可能性のあるテストの種類の 1 つにすぎません。


予測テスト選択が静的コード分析に役立つ 1 つの方法は、問題を含む可能性が最も高いコードのテストを優先することです。過去のテスト結果を分析し、失敗に関連するパターンを特定することにより、Predictive Test Selection は、コードの最も重要な領域または問題のある領域にテスト作業を集中させるのに役立ちます。これにより、不必要なテストに費やす時間とリソースを削減しながら、最も重大な問題をできるだけ早く特定して対処することができます。


全体として、予測テストの選択と静的コード分析を組み合わせることで、組織はテスト プロセスの効率と有効性を向上させ、ソフトウェアの品質と信頼性を確保できます。

最終的な考え

静的分析は、組織がコードの品質を維持するための重要なツールです。コードの欠陥を減らし、保守性を向上させることができますが、誤検知が蔓延する可能性があり、組織が必要とする範囲をカバーするために複数のツールが必要になる場合があります.


これらの問題があっても、静的分析は、どの組織にとっても高品質のコードを提供するための重要な側面です。


Predictive Test Selection を使用して、より高速でスマートな静的コード分析を実行します**。** テストの種類、コミットの頻度、分岐数に関係なく、CI とシームレスに統合します。


予測テストの選択により、アイドル時間を 70% 削減できます。スケーリング可能なインテリジェントなテストを使用して、静的分析で開発者に優れたエクスペリエンスを提供します。