ブログ

MISRA C:2012とMISRA C:2004の比較 - 移行方法について

August 17, 2021
Secure Code Warrior
シェーダーの作成、色の設定、三角形の描画を行うOpenGLコマンドのコードスニペット。

Secure Code Warriorでは、常にトレーニング内容の拡充に努めています。組み込み開発者やセキュリティ管理者がセキュアな組み込みシステムを構築できるよう支援するため、私たちは組み込みシステムセキュリティの分野に注力しています。本記事では、MISRA C:2012規格について、そしてセキュアな組み込みシステムを構築するために、なぜその準拠が必要なのかを解説します。

C言語でコードを書いていると、一見正しく見えるものの、本質的には誤っている実装を簡単に行ってしまいがちです。コードは問題なくコンパイルされ、しばらくの間は正常に動作するかもしれません。しかし、入力サイズやメモリ使用量が増大すると、同じコードがクラッシュしたり、未定義の動作を引き起こしたりする可能性があります。例えば、特定の入力値によって整数がオーバーフローしたり、特定の文字列によって配列が境界外アクセスを起こしたりするケースです。

そこで役立つのがMISRA Cコーディング標準です。この規格が定めるルール、ガイドライン、ベストプラクティスに従うことで、開発者は組み込み開発において安全で信頼性の高いC言語コードを書くことができます。

最新版であるMISRA C:2012では、新しいルールの追加や既存ルールの強化が行われ、不整合が解消されています。古いバージョンを使用している場合は、今こそ移行する絶好の機会です。

MISRA Cコーディング標準とは?

MISRA C標準には、C言語におけるコードの安全性、移植性、信頼性に関するガイドラインが含まれています。最初のガイドラインは1998年にリリースされ、C言語に特化したものでした。

しかしその後、MISRAコンソーシアムはC++向けのコーディング標準も策定するようになりました。すべてのMISRA Cドキュメントには、一連のルール、非準拠の例、そしてそれらのルールが策定されるに至った背景に関する詳細なセクションが含まれています。

C言語とC++は、組み込みソフトウェア開発で最も広く使用されている言語です。その主な理由は、機械語に対して1〜2レベルの抽象化しか持たないため、高速であることです。しかし、これは同時に、特にC言語において安全なコードを書くことが難しく、エラーが発生しやすいことを意味します。例えば、JavaやC#のような高水準言語では、ガベージコレクションや動的型付けといった些細なことを気にする必要はありません。

しかしC言語には、あらかじめ定義されたガベージコレクションの仕組みがありません。つまり、データ構造のためにメモリを割り当てた場合、使い終わったら自分で手動で解放する必要があります。そうしなければ、他の言語とは異なり、C言語はメモリを自動的に解放してくれないため、メモリリークが発生します。

MISRA C:2004 (C2) と MISRA C:2012 (C3) の違いとは?

C3とも呼ばれるMISRA C:2012は、2013年4月に初めてリリースされました。何千人もの専門家や組織の知見を結集したC3は、新しいルールの追加、既存ルールの説明や背景の強化、そしていくつかの抜け穴の修正を行っています。

C3はC99言語規格をサポートしつつ、旧来のISO C90のルールも維持しています。C3の主な焦点は、ルール適用のコストを削減しつつ、クリティカルなシステムにおいてC言語をより安全に使用できるようにすることでした。これらすべての理由から、まだ移行していないのであれば、新しい規格への切り替えを検討するのが賢明です。

主な変更点は以下の通りです。

  • Correct issues that were found in the 2004 version.
  • Significantly increase the number of decidable rules. A rule is decidable, if an analysis tool can help you determine conformity to it.
  • Rules are categorized as “required”, “advisory”, or “mandatory”. Mandatory rules must never be broken, under any circumstances. Required and advisory rules can be violated in special scenarios, provided the violation is justified.
  • Added guidance regarding how to apply rules to auto-generated code. This is very important because the same guidelines of human-written code, don’t always apply to that generated by a tool.
  • Remove the overly generalized rules that forbade reasonable user behavior. E.g. previously it was recommended to not use macros at all, since they can lead to various difficulties and confusion (can’t debug macros, macros don’t have namespaces etc.). This prevented the use of macros, even in situations where they could provide an elegant, safe, and convenient solution. In MISRA C: 2012, new rules regarding macros were introduced, allowing people to use them carefully, whenever applicable. See the following excerpt, taken from a MISRA C document, that recommends using a macro over a function.
Text excerpt about using macros in MMMC tool to implement integrators and suppress warnings with code example.

MISRA Cルールの実践

説明はこれくらいにして、実際にMISRA Cのルールを適用する例を見ていきましょう。

memcpy、memmove、memcmpのポインタ引数には互換性のある型を使用する

標準ライブラリ関数の memcpy、memmove、および memcmp は、指定されたバイト数分だけバイト単位で移動または比較を行います。MISRA C:2012のルール21.15では、これら2つの関数パラメータは同じ型へのポインタでなければならないと規定されています。互換性のないポインタ型で関数を呼び出すと、誤りである可能性があります。

MISRAコンプライアンス公式ドキュメントから引用した以下の画像をご覧ください。このルールは 必須(required)、判定可能(decidable)であり、C90とC99の両方に適用されます。

Screenshot of MISRA C Rule 21.15

ルールの説明に続く例を以下に示します。

Screenshot of a non-compliant solution.

ご覧の通り、オブジェクトの型が異なる(uint8_tとuint16_t)ため、これは非準拠のソリューションです。

長さを入力として受け取らない文字列操作関数は、境界外アクセスを引き起こしてはならない

<string.h>に含まれる、長さを入力として受け取らない文字列操作関数は、境界外アクセスを引き起こしてはなりません。対象となる関数は、strcat、strchr、strcmp、strcoll、strcpy、strcspn、strlen、strpbrk、strrchr、strspn、strrstr、strtokです。このルールは 強制(mandatory)です。判定不能(undecidable)

Screenshot of MISRA C rule 21.17.

対応する例は以下の通りです。

Screenshot of a correct example of string handling functions

ご覧の通り、strcpy 関数(f1)では、5文字しか保持できない文字列の長さを超えてコピーが行われます。また、strcpyの準拠した安全な使用例も示しており、こちらでは「str」の内容が収まる場合にのみコピーが行われます。

外部から受信したデータを検証する

Dir 4.14では、「外部」ソースから受信したデータの妥当性を確認することを推奨しています。外部入力には以下が含まれます。

  • ファイルからの読み取り。
  • 環境変数からの読み取り。
  • あらゆるユーザー入力。
  • 通信チャネル経由で受信したあらゆるデータ(TCP接続やHTTP APIなど)。

このディレクティブは 必須(required)カテゴリに分類され、C90とC99の両方に適用されます。その根拠は、プログラムは外部ソースから受信したデータを制御できないため、そのデータが無効であったり悪意のあるものであったりする可能性があるからです。例えば、プログラムがユーザーに数値を入力させることを想定していても、ユーザーが文字列を入力する可能性があります。入力を処理する前に、プログラムはそれが確実に数値であることを検証しなければなりません。

Validity Of Values Received From External Sources Shall Be Checked

MISRA C:2012への移行方法

MISRA C:2012へ移行するには、コーディングガイドラインのドキュメントを更新する必要があります。ガイドラインを使用せず、静的解析ツール(推奨される選択肢)に依存している場合は、ツールの新しいバージョンを入手する必要があるかもしれません。MISRA C:2012への準拠をチェックできるツールを3つ紹介します。

  1. Cppcheckは、MISRAルールをチェックし、さまざまな種類のバグを検出できるオープンソースツールです。
  2. PC-lint Plusは、30日間の評価期間がある有料ツールです。MISRA Cへの準拠チェックに加え、潜在的なバグや脆弱性の特定にも役立ちます。
  3. CodeSonarは、MISRA CとC++の両方の準拠をチェックするもう一つのツールです。

MISRA準拠をテストできるコンパイラもいくつか存在します。ルール違反が検出された場合、それに応じて警告や例外が発生します。例えば、Green Hills Softwareは、32ビットおよび64ビットアーキテクチャの両方で、すべてのMISRA規格をサポートするコンパイラを提供しています。

Secure Code Warriorを使用して開発者のMISRA Cスキルを向上させる

Secure Code Warriorの主力製品である学習プラットフォームには、安全なC/C++コードを書くためのトレーニングに役立つ、数多くのインタラクティブな課題、コース、評価が用意されています。プラットフォーム上のコンテンツはフレームワーク固有であり、非常に魅力的です。当社の「C/C++:Embed」コーディング課題は、MISRA C、AUTOSAR C++(MISRA C++)、およびIECから着想を得ています。

開発者はパーソナライズされた学習の旅に出ることができ、C/C++特有の脆弱性を特定し、さらに重要なこととして、それらのバグを修正する方法を学ぶことができます。このプロセスを通じて、開発者は自身の進捗状況を追跡して弱点を把握し、同僚との友好的なコーディングコンペティションを楽しむことさえ可能です。当社のソリューションが自動車・輸送業界をどのように支援しているかについて、詳しくはこちらをご覧ください。

当社のチャレンジがいかにインタラクティブで、組み込み開発に特化しているかをご確認いただけます。ぜひC/C++:Embedチャレンジを学習プラットフォームでお試しください!

タグライン

AI主導の開発をリリース前にガバナンスする

AIを活用したリスク測定、コミット時のセキュアコーディングポリシーの強制、そしてSDLC全体を通じたセキュアなデリバリーの加速を実現します。

デモを予約する
リソースライブラリ

他のブログ記事を見る

セキュアコーディング、AIガバナンス、ソフトウェアリスク管理に関する専門的なコンテンツをご覧ください。

すべて表示
導入事例
フィルターラベル
これはdivブロック内のテキストです。

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

詳細はこちら
導入事例
フィルターラベル
これはdivブロック内のテキストです。

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

詳細はこちら
導入事例
フィルターラベル
これはdivブロック内のテキストです。

セキュリティ文化の統一:Sageはいかにしてチャンピオンプログラムを構築したか

Sageがどのようにして柔軟かつ関係性を重視したアプローチでセキュリティを強化し、200名以上のセキュリティチャンピオンを育成して、目に見えるリスク低減を実現したのかをご紹介します。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

2026年サイバーセキュリティ意識向上月間:企業防衛に不可欠なAIセキュリティの理解

主要なAI企業の多くが、安全対策が追いつくまでの間、AI開発を世界的に減速させるよう公に呼びかける事態となっています。しかし現実には、深刻なセキュリティ問題はすでに顕在化しています。AI導入に伴う金銭的コストやリスクが増大し続ける中、多くのセキュリティリーダーや経営陣は差し迫った状況に追い込まれています。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

イネーブラー8:プログラムのブランディング

セキュアコーディングプログラムを成功させるには、優れたコンテンツ以上のものが必要です。イネーブラー8では、ブランディングによって参加を「憧れのステータスを得る体験」へと変える方法を解説します。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

すべての従業員が今、AIサイバーセキュリティの最前線に立っている

エンタープライズテクノロジーの状況は、手遅れになるまで誰も予測できなかったほどの速さで変化しています。私たちは今、人間が書いたコードと基本的なコパイロット支援の時代から、エージェント型開発ライフサイクル(ADLC)の時代へと正式に足を踏み入れました。自律型AIエージェントは、複数の機能にわたってかつてない効率性をもたらす一方で、全く新しい種類のセキュリティリスクや規制リスクも引き起こしています。

詳細はこちら

AIを活用した開発をリリース前にセキュアに

開発者のリスクを可視化し、ポリシーを適用することで、ソフトウェア開発ライフサイクル全体における脆弱性を未然に防ぎます。

デモを予約する
該当する項目が見つかりません。