どんなシステムを構築する場合でも、エラーを早期かつ頻繁にチェックして修正できれば、プロジェクトの後工程で積み増しされる作業の量が大幅に削減されます。
ソフトウェア開発では、最初から優れたソフトウェアを設計するのではなく、ユニットテストや機能テストを通じて製品に品質を作り込もうとするアプローチをとることがよくあります。最初からより高い品質をソフトウェアに組み込むには、静的解析が役に立ちます。静的解析は、ソフトウェアエンジニアがアプリケーションデリバリーを加速しながら欠陥を防ぎ、コードを強化するために実行できる最も簡単で効果的なアクティビティです。
静的コード解析とは
静的コード解析(または静的解析)は、ソフトウェアの欠陥につながる書き方がコードに存在しないかどうかを解析する開発テストです。リスクの高い記述が検出されると、静的解析ツールは違反を報告します。静的解析にはいくつかのタイプがあり、それぞれ独自の長所と短所があります。
パターンベースの静的解析
最も単純な形式では、静的解析ツールはコードをスキャンし、1つまたは複数のルールセットと照合します。たとえば、実際にはnull文字 ‘\0’ が意図されているときに、文字列 “\0” を誤って使用することがあります。この間違いにより、メモリが破壊され、プログラムがクラッシュする可能性があります。静的解析ツールは、コード内の該当パターンを検出し、エラーの可能性があるとして報告します。このような静的解析は、パターンベースの静的解析と呼ばれています。パターンの一部は、単純な構文チェッカーであり、文章作成で使用するスペルチェッカーに似ています。他のパターンははるかに複雑で、微妙な問題に関連するパターンを検出することができます。この種の静的解析は、誤検出に悩まされることはほとんどありません。
Motor Industry Software Reliability Association (MISRA)やJoint Strike Fighter (JSF)などの現代のソフトウェアエンジニアリング標準は、特定の書き方は問題がある可能性があるため、安全上重要なコードでは避けるべきであるという考えに基づいています。
「安全でない」機構に対する「より安全な」代替手段を提供することにより、低レベル機能に関する既知の問題が回避されます。つまり、プログラムは「より安全な」サブセットを使用して記述されます。
Joint Strike Fighter Air Vehicle C++ Coding Standards – Introduction
フロー解析
制御フロー解析またはデータフロー解析とも呼ばれるフロー解析は、パターン解析とはまた少し異なります。このタイプのコード解析では、ルールセットに照らして問題のある記述があるかどうかを確認するのは同じですが、その際、判断パスをシミュレートしてアプリケーションを深く掘り下げ、nullポインターの間接参照やバッファーオーバーフローなどの検出が難しい欠陥、汚染されたデータなどのセキュリティ欠陥を見つけ出します。フロー解析は実際のバグを見つけることができる点で優れていますが、ある程度の誤検出は避けられません。
その他の解析
別の目標を達成する別のタイプの静的解析もあります。たとえば、メトリクス解析ツールは、コード行数や複雑度などのコード特性を測定します。カバレッジ解析ツールは、ユニットテストとアプリケーションテストを追跡して、コードがどの程度テストされているかをよりよく理解できるようにします。自動開発テストプロセスの一環として、これらの解析を総合的に使用すると、アプリケーションの安全性、セキュリティ、および信頼性の可視性が大幅に向上します。
静的解析を実行しない場合のリスク
ソフトウェアはますます複雑化しています。現在、たとえば平均的な自動車には、1,000以上のコード実行MCUと1億行のコードが含まれていることもあります。このように電子的側面が拡大しているため、特に自動車、医療機器、航空などの安全性が重要なアプリケーションでは、欠陥のないコードに近づく取り組みとして、ソフトウェアに対する厳密なエンジニアリングアプローチが必要です。
良いニュースとしては、 OWASP、CERT、MITREなどの組織が、ソフトウェアエンジニアの成功を支援するプログラミングのベストプラクティスを研究し公開していることが挙げられます。また、規制当局が要求するベストプラクティスを公表している業界固有の標準化団体(自動車ソフトウェアに焦点を当てたMISRAなど)もあります。これらのベストプラクティスは、静的解析ツールでルールとして明文化し、組織のポリシーの一部として実装できます。
これらのプログラミング標準を実装でき、また開発プロセスと統合できる静的解析ツールを使用することが重要です。ビジネス上の観点からは、少なくとも1つは静的解析ツールを使用して作業を検証していないと、アプリケーションのデプロイまたはリリースに伴うリスクが大幅に高まります。不具合は悪用可能コードにつながり、悪意のあるハッカーがシステムをクラッシュさせたり、機密データを公開したりするために利用される可能性があります。安全性が重要なソフトウェアの場合、その結果は非常に深刻なものになります。
自動化された静的解析の利点
デスクトップ上で静的解析を実行するだけでも、ある程度はメリットがあるので、小規模なチームやプロジェクトではそれで充分かもしれません。しかし、大規模な組織では、夜間ビルドや継続的インテグレーションの一環として静的解析も自動化する必要があります。開発プロセスの不可欠な部分として実装された静的解析は、以下のように多くの利点をもたらします。
開発サイクルの加速
プロジェクトの初期段階から一貫して静的解析を実行することで、修正のコストが最も低い段階でシステムの欠陥を見つけて修正できます。このプロセスは、解析を実施せずにソフトウェアを開発するよりも最初は時間がかかるかもしれませんが、効率化による利益は開発ライフサイクルを経るにしたがって指数関数的に大きくなります。危険性の高い欠陥の中には、サイクルの後半に対処するのが難しいものもあり、早期発見が重要であることを忘れないでください。
優れた静的解析ツールには、実装されているプログラミング標準についての説明文書も含まれており、ソフトウェアエンジニアのプログラミング知識と専門性の向上に役立ちます。これらの標準に従っているうちに、継続的なフィードバックを通じてプログラマーの能力が向上することで、コードの品質水準も向上します。静的解析ツールが、欠陥修正タスクの優先順位を自動的に設定できるような大規模な開発テストプラットフォームの一部である場合、ソフトウェアをさらに迅速にデリバリーすることができます。
欠陥率の低下
静的解析を使用すると、欠陥を早期に発見して修正することができ、下流でのシステミックな欠陥の再発を防ぐことができます。早期発見の方針を採用することで、欠陥予防ポリシーをより簡単に実装することができ、開発ライフサイクル全体の欠陥率を低減できます。(ここでなりふり構わず宣伝すると、Parasoft C/C++testは、静的解析の違反を報告するだけでなく、すばらしく洗練された分析プラットフォームと統合し、報告されたすべての欠陥と、コードベースの品質への影響を把握できます)
継続的改善
DevOpsという用語は、開発プロセスとデリバリープロセスの最適化および迅速化に必要な部門間の共同作業とコミュニケーションを促進するプラクティスの集合を表すのによく使用されます。部門間で知識とタスクを共有することで、組織はSDLCを加速して品質プロセスを向上させるための効率的なプロセスを確立します。
しかし、このアプローチを有効にするためには、自動化されたフィードバックループを実装し、要件の開発から運用まで品質ポリシーを一貫して適用できるようにする必要があります。
自動化された静的解析は、フィードバックループのメカニズムであるだけではなく、DevOpsモデルのもと、さまざまな部門が効果的にコラボレーションするために必要とするデータも生成します。特に、ユニットテストおよび回帰テストと合わせて行う静的解析には、次のような役割があります。
- コード品質の保証
- 開発プロセスを改善するために必要なビッグデータを提供する
- DevOpsの自動フィードバックループの仕組みを提供する
結果として、静的解析は継続的かつ自動化されたプロセス改善のためのエージェントになります。静的解析は、リリースまたはQAで検出された欠陥を調べて、コードを強化し、将来これらの欠陥が発生する可能性を排除する方法があるかどうかを判断する手段を提供します。
Parasoftの静的解析ソリューションについて
オープンソースのユーティリティからフルラインナップの開発テストスイートまで、市場にはいくつもの静的解析ツールがあります。Parasoftの開発テストソリューションは、幅広いソフトウェア品質プラクティスを自動化するための統合プラットフォームを提供し、Parasoft DTPとの連携によって、意味のある包括的なレポートとインテリジェントな分析オプションを提供します。
CおよびC ++言語向けの Parasoft C/C ++testは、幅広い静的コード解析機能と2,200を超えるルール(MISRA、MISRA C ++、FDA、Scott MeyersのEffective C ++、Effective STL、その他の定評あるソースに基づいて実装された、業界でも最多数レベルのルール)に加えて、開発テストのプラクティスを支援する統合ソリューションを提供します。Parasoft C / C ++テストは、ユニットテストを生成して実行し、ステートメント、ブロック、パス、決定(分岐)、単純条件、およびMC / DCカバレッジを含むいくつかのタイプのコードカバレッジの収集を可能にし、実行時解析を提供するほか、機能安全規格に準拠するためのツール認定キットが付属しています。
Parasoftはまた、 Parasoft JtestによってJavaアプリケーションの完全な静的コード解析を、Parasoft dotTESTによって.NETアプリケーションの静的コード解析をサポートしています。 CおよびC ++と同様、静的解析だけでなく、ソフトウェアテストを容易にし、効率を高める包括的なソリューションを提供する、完全に統合されたソリューションです。Parasoftの静的解析を使用してコードを解析し、自動化されたビルドに統合することで、不具合を自動的かつ継続的に防止することができます。
まとめ
静的コード解析は、アプリケーションが期待どおりに機能することを保証する重要なパーツです。開発チーム全体の速度を向上させるだけでなく、潜在的に危険なソフトウェアをリリースすることに伴うリスクを軽減します。少しでも解析を実施するのが、まったく実施しないよりましなのは当然ですが、静的解析をより大きなソフトウェアテストインフラストラクチャに統合して、実践の効果を最大限に高めるべきです。Parasoftは、C/C++test、Jtest、およびdotTESTというエンタープライズグレードのコード解析およびテストスイートに加えて、DTPという高度な分析およびレポートシステムを提供しています。これらのテクノロジを組み合わせることで、ソフトウェアエンジニアリングチームはソフトウェアデリバリーを高速化し、アプリケーションが期待どおりに機能することを保証できます。
(この記事は、開発元Parasoft社 Blog 「How Does Static Analysis Prevent Defects and Accelerate Delivery?」2018年6月19日の翻訳記事です。)
Parasoft の C/C++ 言語対応テストツール C++test Java 言語対応テストツール Jtest .NET Framework 対応テストツール dotTEST