静的解析を通じて、より効率的なコード品質管理を実現

 

IARシステムズは、IAR Embedded Workbenchとシームレスに連携するアドオン機能として、静的解析ツールであるC-STATを販売開始しました。本記事では、静的解析について、C-STATを導入することでコード品質管理をどう効率化できるかについて、解説していきます。

静的解析とは?

コーディングの世界ではこのような名言があります。
「A wise man once said: Always code as if the person who ends up maintaining your code will be a violent psychopath who knows where you live.(コーディングは常にこう、心がけるのだ。出来上がったコードを最後にメンテナンスするのは暴力的な誰かで、そして、君の住所を知っている)」。
静的解析は、皆さんがこのような問題に陥らないための手法の一つです。

静的解析は人によって異なる解釈のされる用語であり、いくつもの異なる定義が存在します。本記事では静的解析を、一般的な定義のもと、エラーリスクのあるコード抽出、他のハードウェアプラットフォームへの移植を阻害するコードパターン、セキュリティ上の脆弱性を生み出すコードなどを検出する機能として解説します。

静的解析で検出しうるエラーリスクとして、変換エラーやゼロ除算などの算術演算問題や、メモリーリークや境界外エラーなどのメモリ管理問題、デッドコードや関連する問題が挙げられます。関連機能としてはMISRA Cといったコーディング規約への準拠やCERT1*¹やCWE*²などで危険とされているコード構造の回避などが関連します。

本記事における静的解析の特徴としては、実行中プログラムから、エラーリスクを検出する動的解析と対比し、ソースコードレベルで解析される機能とします。

ソースコードレベルの静的解析にはどのようなものがあるか?例を挙げると、IAR Embedded Workbenchですでに提供しているスタック使用量解析機能と対比することができます。スタック使用量解析機能も広い意味での静的解析ですが、コンパイル・リンクされた最終実行ファイルでの解析となります。

静的解析の大きな利点の一つが、開発しているシステムのパフォーマンスに影響を与えないということです。なぜならば、システムを実行せずに解析できるからです。また、テストパターンの品質からも独立しています。実行中のコードからエラーを検出するには、どのようなデータを持ち、どのような経路で実行したかに依存しますが、静的解析ツールは、少なくとも理論上は、コードのすべての経路を評価することが可能です。

世の中にはC/C++開発のための様々な静的解析ツールが存在します。
コード中の典型的な問題を発見できる単純なパターンマッチのもの(ただし、多くの誤検出[false-positive]を含む)ものから、より洗練されたツールもあります(ただし、その分値段も高価で、より正確な結果が出るまで何時間も実行される)。しかし、このような洗練されたツールであっても高い頻度で誤検出が含まれていることが未だにあります。

また、同時に多くの静的解析ツールはソースコード内のすべてのエラーリスクを検出できるわけではありません。なぜなら、ある程度のサイズのプログラムでさえ、全てを評価しようとすると、何日間もコンピュータを実行しなければいけなくなるからです。

すべてのエラーリスクを検出できると主張するツールも確かに存在しています。しかしながらそれらは、タイトな開発納期の中で、日々新しい機能のコーディングに追われ、毎日検証しなければいけないような開発プロジェクトには適用が難しく、また、誤検出に悩まされることに変わりはありません。

組込み業界における一般的な静的解析ツールの導入にあたってのもう一つの現実問題は、お使いのビルド環境と適合して、購入後すぐに使える、ということが少ないという事実です。ユーザはどのようにファイルを登録するか、ターゲットハードウェアを効率的に制御するための言語拡張をどう取り扱うべきか、といった全ての設定を理解しなければいけません。

静的解析ツールの比較ポイント

異なる静的解析ツールを比較することは簡単ではありません。それぞれのツールは異なる前提のもとに、異なるエリアにフォーカスし、異なる技術が使われています。そのため、それぞれのツールがテストコードでベンチマーク結果を求めたとき、それぞれ異なる問題を検出することになります。

ある種のツールは、特定カテゴリーの特定エラーの検出に特化していて、他のエラーは一切検出しないということさえありえます。これはアメリカ国立標準技術研究所によって運営されているSAMATE*³プロジェクトによっても明らかにされています。研究所はSATEと呼ばれる静的解析ツールの展示会を定期的に開催しており、非常に形式化されたツール評価に多くのツールベンダが参加しています。

C-STATを使ってみよう !

IARシステムズがどのように静的解析に取り組んだか。弊社のお客様である組込みソフトエンジニアにどのような静的解析ツールを提供すべきか検討をはじめてすぐに、我々はツール統合や複雑な設定の問題がなく、簡単に使用できるツールに対する要求があることに気がつきました。加えて、我々はMISRAのような標準的なコーディング規約などに対応していくと同時に、もっと幅広い視点でもエラーリスクに対処していこうと考えました。

我々の試みはIAR Embedded Workbenchのアドオン製品としてのC-STATのリリースとして結実しました。C-STATはIDEであるEmbedded Workbenchとシームレスに連携されており、あたかも通常のビルドツールかのように簡単に使用することができます。他社ツールと併用する際に生じる、複雑な設定は不要で、言語対応への悪戦苦闘や、その他のビルド問題も生じません。それに加え、すでにあるビルド環境での管理を希望するのであればコマンドラインからもコードの静的解析も実行でき、同じ利点を得ることができます。

以下、簡単にC-STATの特徴を挙げます。

  • C/C++をサポートする静的解析ツールで、ハードウェア制御を直接行うためのIAR Embedded Workbench特有の言語拡張もサポート。
  • バッファオーバフロー、数値演算および変換問題、ヒープ管理などの、若干疑わしいものから、明らかにおかしいものまでコードパターンを検出できる、先端技術に基づいた静的解析。
  • モデルチェックや制約解決に基づき、誤検出を管理、却下するC-STATの革新的な技術。
  • C-STATでCERTおよびCWEの提言、MISRA C:2012、MISRA C++:2008およびMISRA C:2004などのコーディング規約、ルールセットの約600ルールに対応する約250のチェックをサポート。
  • C-STAT gives you fine-grained control of what rules and checks you want to deal with.
  • C-STATでは、適用したいルールセットやチェックを任意で設定することが可能。
  • クロスモジュール解析の利点として、C-STATはモジュール間を超えて情報を伝搬。C-STATはまた、複数ファイルのコンパイルモードにも対応しており、ある種のチェックでは、全てのソースコードを一つのモジュールとして解析することで、解析制度の向上も可能。

結論として、C-STATを使用することで、日々の開発業務を通じてコード品質を向上し、管理することができるようになります。すなわち各プログラマーがコード品質をチェックすることで、多くのメリットを得ることができます。問題を早期に見つけることで最終製品への影響を抑え、プロジェクトのスケジュールへの悪影響・開発納期の遅延も抑制することができます。

¹ Computer Emergency Response Team(CERT)によって発行されているThe CERT C/C++ Secure Coding StandardsC/C++プログラミング言語におけるセキュアコーディングのルールおよび推奨を提供しています。

詳細は www.cert.org を参照ください。

² CWE(the Common Weakness Enumeratoin) はソフトウェアの脆弱性についてコミュニティ上で作られている辞書です。

詳細は cwe.mitre.org/ を参照ください。

³ SAMATEについての詳細は samate.nist.gov/Main_Page.html を参照ください。