SCW アイコン
ヒーロー背景(区切りなし)
ブログ

ミスラ C 2012 対 MISRA C2-レボアユー

セキュアコード・ウォリアー
2021年8月17日 発行
最終更新日: 2026年3月10日

セキュア・コード・ウォリアーでは、常にトレーニング対象範囲の拡大を目指しています。組込み開発者とセキュリティ管理者が安全な組込みシステムを構築できるようにするために、私たちは組込みシステム・セキュリティの世界に参入しています。この投稿では、MISRA C 2012 標準と、安全な組み込みシステムを構築するためになぜそのコンプライアンスが必要なのかについて説明します。

C でコードを書いていると、一見正しいように見えて本質的に間違っているものを実装するのはとても簡単です。コードは問題なくコンパイルできるかもしれませんし、一定期間でも正常に動作するかもしれません。しかし、入力サイズやメモリが増えると、同じコードがクラッシュしたり、未定義の動作をしたりする可能性があります。たとえば、特定の入力番号によって整数がオーバーフローしたり、特定の文字シーケンスが原因で配列が範囲外になったりします。

そこで、MISRA C コーディング標準が役に立ちます。この規格によって定められた規則、ガイドライン、ベスト・プラクティスにより、開発者は組込み開発用の安全で信頼できる C コードを書くことができます。

この規格の最新版である MISRA C 2012 では、新しい規則が追加され、既存の規則が強化され、いくつかの相違点が修正されています。まだ古いバージョンを使用している場合は、今が切り替えの絶好の機会です。

MISRA C コーディング標準とはどのようなものですか?

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

しかし、それ以来、MISRAコンソーシアムはC++のコーディング標準も開発しています。すべての MISRA C 文書には、一連の規則、非準拠の例、および当該規則の開発に貢献した背景情報に関する詳細なセクションが含まれています。

CとC++は、組み込みソフトウェアの開発で最も広く使用されている言語です。その主な理由の 1 つは、これらの言語は高速で、機械語と比べて抽象化レベルが 1 ~ 2 レベルしかないことです。しかしこれは、特に C で安全なコードを書くのは難しく、間違いも起こりやすいということでもあります。たとえば、Java や C# などのほとんどの高級言語では、ガベージコレクションや動的型付けなどの些細なことを気にする必要はありません。

しかし、C言語では、ゴミを集めるための定義済みの方法はありません。つまり、データ構造にメモリを割り当てる場合、使い終わったら手動でメモリを解放する必要があります。そうしないと、C は他の言語とは異なり、メモリを解放しないため、メモリリークが発生します。

MISRA C 2004 (C2) 対 MISRA C 2012 (C3) — 何が変わったのか?

MISRA C: 2012はC3とも呼ばれ、2013年4月に初めてリリースされました。C3は、何千もの人々や組織の活動から得た知識を活用して、新しいルールを追加し、既存のルールの説明や背景を強化し、抜け穴を塞いでいます。

C3 は C99 バージョンの言語をサポートすると同時に、古い ISO C90 のルールも維持しています。C3 の主な焦点は、クリティカルなシステムで C 言語をより安全に使用できるようにすると同時に、ルール施行にかかる通常のコストを削減することでした。こうしたことから、まだ新しい標準に切り替えていない場合は、新しい標準に切り替えるのが賢明です。

全体として、最も重要な変更点は次のとおりです。

  • 2004 バージョンで見つかった問題を修正しました。
  • の数を大幅に増やす 決定可能なルール。 ルールは 決定可能、 分析ツールがそれへの適合性を判断するのに役立つかどうか。
  • ルールは「必須」、「勧告」、または「必須」に分類されます。強制ルールはいかなる状況においても決して破ってはなりません。特別なシナリオでは、違反が正当化される限り、必須規則や勧告規則に違反する可能性があります。
  • 自動生成コードにルールを適用する方法に関するガイダンスを追加しました。これは非常に重要です。なぜなら、人間が書いたコードと同じガイドラインが、ツールによって生成されたコードには必ずしも当てはまらないからです。
  • ユーザーの合理的な行動を妨げる過度に一般化されたルールを削除してください。たとえば、以前はマクロをまったく使用しないことが推奨されていました。マクロは、さまざまな問題や混乱を招く可能性があるためです (マクロをデバッグできない、マクロに名前空間がないなど)。これにより、マクロがエレガントで安全で便利なソリューションを提供できるような状況でも、マクロを使用できなくなりました。MISRA C: 2012 では、マクロに関する新しい規則が導入され、ユーザーはいつでもマクロを慎重に使用できるようになりました。MISRA C 文書から抜粋した次の抜粋では、関数ではなくマクロを使用することを推奨しています。

MISRA C ルールが実際に使われています

説明は以上です。次は、MISRA C のルールを、その適用方法の例とともに実際に使ってみましょう。

互換性のある型を memcpy、memmove、および memcmp へのポインタ引数として使用する

標準ライブラリ関数 メモリコピー、メモリムーブ、 そして memcmp バイト単位の移動または指定されたバイト数の比較を行います。MISRA C 2012 規格の規則 21.15 では、2 つの関数パラメータは同じ型へのポインタでなければならないと規定されています。互換性のないポインタ型を使った関数呼び出しは、間違いを示している可能性があります。

MISRA の公式コンプライアンス文書から抜粋した次の画像を見てください。ルールは 必須、決定可能、 C90とC99の両方に適用されます。

MISRA Cルール21.15のスクリーンショット

ルールの説明の次に例を示します。

非準拠のソリューションのスクリーンショット。

ご覧のように、オブジェクトは異なるタイプ (uint8_t と uint16_t) であるため、これは非準拠のソリューションです。

入力として長さをとらない文字列処理関数は、範囲外アクセスにはなりません

<string.h>その長さを入力として受け取らない文字列処理関数では、範囲外アクセスが発生しないはずです。関連する関数は strcat、strchr、strcmp、strcoll、strcpy、strcspn、strlen、strpbrk、strrchr、strspn、strrstr、strtok です。ルールは 必須、 つまり、どんな状況でも破ることはできないということです。これは C90 と C99 の両方に適用され、 決まらない。

MISRA Cルール21.17のスクリーンショット。

対応する例は次のとおりです。

文字列処理機能の正しい例のスクリーンショット

ご覧の通り、 ずんぐりした 関数 f1 では、5 文字しか格納できない文字列の長さを超えてコピーします。また、strcpy の仕様に準拠した安全な使い方もあります。strcpy では、「str」の内容が収まる場合にのみ文字列がコピーされます。

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

Dir 4.14では、「外部」ソースから受信したデータの有効性を確認することを推奨しています。外部入力には次のようなものがあります。

  • ファイルからの読み込み。
  • 環境変数から読み取ります。
  • 任意のユーザー入力。
  • 通信チャネルを介して受信したもの。たとえば、TCP 接続や HTTP API などを介して送信された場合などです。

この指令は 必須 カテゴリであり、C90とC99の両方に適用されます。その理由は、外部ソースから受信したデータをプログラムが制御できないため、このデータは無効または悪意のあるものである可能性があるということです。例えば、プログラムではユーザーが数字を入力することを期待しているのに、ユーザーが文字列を入力したとします。入力を処理する前に、プログラムは入力が実際に数値であることを確認する必要があります。

外部からの数値の妥当性を確認すること。

MISRA C 2012 に切り替える方法

MISRA C 2012 に切り替えるには、コーディングガイドラインドキュメントを更新する必要があります。これを使用せず、代わりに静的解析ツール (推奨選択肢) を使用している場合は、新しいバージョンのツールを入手しなければならない場合があります。MISRA C 2012 への準拠を確認するツールが 3 つあります。

  1. Cppcheck は、MISRA ルールをチェックしたり、さまざまな種類のバグを検出したりできるオープンソースツールです。
  2. PC-リントプラス は、30 日間の評価期間がある有料ツールです。MISRA C への準拠を確認するだけでなく、潜在的なバグや脆弱性を特定するのにも役立ちます。
  3. コードソナー は、MISRA C と C++ の両方への準拠をチェックするもう 1 つのツールです。

MISRA への準拠をテストできるコンパイラもいくつかあります。ルール違反が検出されると、それに応じて警告または例外が発生します。例えば グリーンヒルズソフトウェア は、32 ビットアーキテクチャと 64 ビットアーキテクチャの両方で、すべての MISRA 標準をサポートするコンパイラを提供します。

セキュアコードウォリアーを使用して MISRA C の開発者をスキルアップする

Secure Code Warriorの主力製品である学習プラットフォームには、開発者が安全なC/C++コードを書くためのトレーニングに役立つインタラクティブな課題、コース、評価が多数あります。プラットフォーム上のコンテンツはフレームワークに特化しており、非常に魅力的です。C/C++: Embed コーディングの課題は、MISRA C、AUTOSAR C++ (MISRA C++)、IEC の両方からインスピレーションを得たものです。

開発者は、C/C++固有の脆弱性を特定し、さらに重要なことに、それらのバグの修正方法を学ぶという、パーソナライズされた学習ジャーニーに乗り出すことができます。このプロセスでは、開発者は自分の弱点を特定するために進捗状況を追跡できるほか、同僚との友好的なコーディングコンテストを楽しむこともできます。詳細はこちらをご覧ください。 自動車および輸送産業への支援方法 私たちのソリューションで。

私たちの課題がどれほどインタラクティブで、埋め込みに焦点を当てているかを知りたいですか?試してみてください 一部の C/C++: 埋め込みの課題 今日は学習プラットフォームで!

リソースを表示
リソースを表示

アポリ、MISRA C 2012 とC2 ヴァングインプラシ、WERGVING CODOWLISISISSA。ABINARKNALTたりMISRAのせいせいせいでもうなずく。

もっと興味がありますか?

セキュアコード・ウォリアーは、開発者がスキルを向上させるにつれ、セキュアコーディングを前向きで魅力的な体験に変えます。セキュリティスキルを持つ開発者が、つながった世界で日常的にスーパーヒーローになれるよう、コーダー一人ひとりが望む学習経路へと導きます。

もっと詳しく

Secure Code Warriorは、ソフトウェア開発ライフサイクル全体にわたってコードを保護し、サイバーセキュリティを最優先とする文化を築くお手伝いをします。アプリケーションセキュリティマネージャー、開発者、CISO、またはセキュリティ関係者であるかに関わらず、安全でないコードに関連するリスクを軽減するお手伝いをします。

デモを予約
シェア:
リンクトインのブランドソーシャルx ロゴ
著者
セキュアコード・ウォリアー
2021年8月17日発行

セキュアコード・ウォリアーは、開発者がスキルを向上させるにつれ、セキュアコーディングを前向きで魅力的な体験に変えます。セキュリティスキルを持つ開発者が、つながった世界で日常的にスーパーヒーローになれるよう、コーダー一人ひとりが望む学習経路へと導きます。

この記事は、Secure Code Warriorの業界専門家チームによって執筆されました。開発者が最初から安全なソフトウェアを構築するための知識とスキルを身につけることを目指しています。セキュア・コーディングの実践に関する深い専門知識、業界動向、現実世界の洞察を活用しています。

シェア:
リンクトインのブランドソーシャルx ロゴ

セキュア・コード・ウォリアーでは、常にトレーニング対象範囲の拡大を目指しています。組込み開発者とセキュリティ管理者が安全な組込みシステムを構築できるようにするために、私たちは組込みシステム・セキュリティの世界に参入しています。この投稿では、MISRA C 2012 標準と、安全な組み込みシステムを構築するためになぜそのコンプライアンスが必要なのかについて説明します。

C でコードを書いていると、一見正しいように見えて本質的に間違っているものを実装するのはとても簡単です。コードは問題なくコンパイルできるかもしれませんし、一定期間でも正常に動作するかもしれません。しかし、入力サイズやメモリが増えると、同じコードがクラッシュしたり、未定義の動作をしたりする可能性があります。たとえば、特定の入力番号によって整数がオーバーフローしたり、特定の文字シーケンスが原因で配列が範囲外になったりします。

そこで、MISRA C コーディング標準が役に立ちます。この規格によって定められた規則、ガイドライン、ベスト・プラクティスにより、開発者は組込み開発用の安全で信頼できる C コードを書くことができます。

この規格の最新版である MISRA C 2012 では、新しい規則が追加され、既存の規則が強化され、いくつかの相違点が修正されています。まだ古いバージョンを使用している場合は、今が切り替えの絶好の機会です。

MISRA C コーディング標準とはどのようなものですか?

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

しかし、それ以来、MISRAコンソーシアムはC++のコーディング標準も開発しています。すべての MISRA C 文書には、一連の規則、非準拠の例、および当該規則の開発に貢献した背景情報に関する詳細なセクションが含まれています。

CとC++は、組み込みソフトウェアの開発で最も広く使用されている言語です。その主な理由の 1 つは、これらの言語は高速で、機械語と比べて抽象化レベルが 1 ~ 2 レベルしかないことです。しかしこれは、特に C で安全なコードを書くのは難しく、間違いも起こりやすいということでもあります。たとえば、Java や C# などのほとんどの高級言語では、ガベージコレクションや動的型付けなどの些細なことを気にする必要はありません。

しかし、C言語では、ゴミを集めるための定義済みの方法はありません。つまり、データ構造にメモリを割り当てる場合、使い終わったら手動でメモリを解放する必要があります。そうしないと、C は他の言語とは異なり、メモリを解放しないため、メモリリークが発生します。

MISRA C 2004 (C2) 対 MISRA C 2012 (C3) — 何が変わったのか?

MISRA C: 2012はC3とも呼ばれ、2013年4月に初めてリリースされました。C3は、何千もの人々や組織の活動から得た知識を活用して、新しいルールを追加し、既存のルールの説明や背景を強化し、抜け穴を塞いでいます。

C3 は C99 バージョンの言語をサポートすると同時に、古い ISO C90 のルールも維持しています。C3 の主な焦点は、クリティカルなシステムで C 言語をより安全に使用できるようにすると同時に、ルール施行にかかる通常のコストを削減することでした。こうしたことから、まだ新しい標準に切り替えていない場合は、新しい標準に切り替えるのが賢明です。

全体として、最も重要な変更点は次のとおりです。

  • 2004 バージョンで見つかった問題を修正しました。
  • の数を大幅に増やす 決定可能なルール。 ルールは 決定可能、 分析ツールがそれへの適合性を判断するのに役立つかどうか。
  • ルールは「必須」、「勧告」、または「必須」に分類されます。強制ルールはいかなる状況においても決して破ってはなりません。特別なシナリオでは、違反が正当化される限り、必須規則や勧告規則に違反する可能性があります。
  • 自動生成コードにルールを適用する方法に関するガイダンスを追加しました。これは非常に重要です。なぜなら、人間が書いたコードと同じガイドラインが、ツールによって生成されたコードには必ずしも当てはまらないからです。
  • ユーザーの合理的な行動を妨げる過度に一般化されたルールを削除してください。たとえば、以前はマクロをまったく使用しないことが推奨されていました。マクロは、さまざまな問題や混乱を招く可能性があるためです (マクロをデバッグできない、マクロに名前空間がないなど)。これにより、マクロがエレガントで安全で便利なソリューションを提供できるような状況でも、マクロを使用できなくなりました。MISRA C: 2012 では、マクロに関する新しい規則が導入され、ユーザーはいつでもマクロを慎重に使用できるようになりました。MISRA C 文書から抜粋した次の抜粋では、関数ではなくマクロを使用することを推奨しています。

MISRA C ルールが実際に使われています

説明は以上です。次は、MISRA C のルールを、その適用方法の例とともに実際に使ってみましょう。

互換性のある型を memcpy、memmove、および memcmp へのポインタ引数として使用する

標準ライブラリ関数 メモリコピー、メモリムーブ、 そして memcmp バイト単位の移動または指定されたバイト数の比較を行います。MISRA C 2012 規格の規則 21.15 では、2 つの関数パラメータは同じ型へのポインタでなければならないと規定されています。互換性のないポインタ型を使った関数呼び出しは、間違いを示している可能性があります。

MISRA の公式コンプライアンス文書から抜粋した次の画像を見てください。ルールは 必須、決定可能、 C90とC99の両方に適用されます。

MISRA Cルール21.15のスクリーンショット

ルールの説明の次に例を示します。

非準拠のソリューションのスクリーンショット。

ご覧のように、オブジェクトは異なるタイプ (uint8_t と uint16_t) であるため、これは非準拠のソリューションです。

入力として長さをとらない文字列処理関数は、範囲外アクセスにはなりません

<string.h>その長さを入力として受け取らない文字列処理関数では、範囲外アクセスが発生しないはずです。関連する関数は strcat、strchr、strcmp、strcoll、strcpy、strcspn、strlen、strpbrk、strrchr、strspn、strrstr、strtok です。ルールは 必須、 つまり、どんな状況でも破ることはできないということです。これは C90 と C99 の両方に適用され、 決まらない。

MISRA Cルール21.17のスクリーンショット。

対応する例は次のとおりです。

文字列処理機能の正しい例のスクリーンショット

ご覧の通り、 ずんぐりした 関数 f1 では、5 文字しか格納できない文字列の長さを超えてコピーします。また、strcpy の仕様に準拠した安全な使い方もあります。strcpy では、「str」の内容が収まる場合にのみ文字列がコピーされます。

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

Dir 4.14では、「外部」ソースから受信したデータの有効性を確認することを推奨しています。外部入力には次のようなものがあります。

  • ファイルからの読み込み。
  • 環境変数から読み取ります。
  • 任意のユーザー入力。
  • 通信チャネルを介して受信したもの。たとえば、TCP 接続や HTTP API などを介して送信された場合などです。

この指令は 必須 カテゴリであり、C90とC99の両方に適用されます。その理由は、外部ソースから受信したデータをプログラムが制御できないため、このデータは無効または悪意のあるものである可能性があるということです。例えば、プログラムではユーザーが数字を入力することを期待しているのに、ユーザーが文字列を入力したとします。入力を処理する前に、プログラムは入力が実際に数値であることを確認する必要があります。

外部からの数値の妥当性を確認すること。

MISRA C 2012 に切り替える方法

MISRA C 2012 に切り替えるには、コーディングガイドラインドキュメントを更新する必要があります。これを使用せず、代わりに静的解析ツール (推奨選択肢) を使用している場合は、新しいバージョンのツールを入手しなければならない場合があります。MISRA C 2012 への準拠を確認するツールが 3 つあります。

  1. Cppcheck は、MISRA ルールをチェックしたり、さまざまな種類のバグを検出したりできるオープンソースツールです。
  2. PC-リントプラス は、30 日間の評価期間がある有料ツールです。MISRA C への準拠を確認するだけでなく、潜在的なバグや脆弱性を特定するのにも役立ちます。
  3. コードソナー は、MISRA C と C++ の両方への準拠をチェックするもう 1 つのツールです。

MISRA への準拠をテストできるコンパイラもいくつかあります。ルール違反が検出されると、それに応じて警告または例外が発生します。例えば グリーンヒルズソフトウェア は、32 ビットアーキテクチャと 64 ビットアーキテクチャの両方で、すべての MISRA 標準をサポートするコンパイラを提供します。

セキュアコードウォリアーを使用して MISRA C の開発者をスキルアップする

Secure Code Warriorの主力製品である学習プラットフォームには、開発者が安全なC/C++コードを書くためのトレーニングに役立つインタラクティブな課題、コース、評価が多数あります。プラットフォーム上のコンテンツはフレームワークに特化しており、非常に魅力的です。C/C++: Embed コーディングの課題は、MISRA C、AUTOSAR C++ (MISRA C++)、IEC の両方からインスピレーションを得たものです。

開発者は、C/C++固有の脆弱性を特定し、さらに重要なことに、それらのバグの修正方法を学ぶという、パーソナライズされた学習ジャーニーに乗り出すことができます。このプロセスでは、開発者は自分の弱点を特定するために進捗状況を追跡できるほか、同僚との友好的なコーディングコンテストを楽しむこともできます。詳細はこちらをご覧ください。 自動車および輸送産業への支援方法 私たちのソリューションで。

私たちの課題がどれほどインタラクティブで、埋め込みに焦点を当てているかを知りたいですか?試してみてください 一部の C/C++: 埋め込みの課題 今日は学習プラットフォームで!

リソースを表示
リソースを表示

レポートをダウンロードするには、以下のフォームに記入してください

当社の製品および/または関連するセキュアコーディングのトピックに関する情報をお送りする許可をお願いします。当社は、お客様の個人情報を常に細心の注意を払って取り扱い、マーケティング目的で他社に販売することは決してありません。

送信
SCW成功アイコン
SCWエラーアイコン
フォームを送信するには、「アナリティクス」クッキーを有効にしてください。設定が完了したら、再度無効にしても構いません。

セキュア・コード・ウォリアーでは、常にトレーニング対象範囲の拡大を目指しています。組込み開発者とセキュリティ管理者が安全な組込みシステムを構築できるようにするために、私たちは組込みシステム・セキュリティの世界に参入しています。この投稿では、MISRA C 2012 標準と、安全な組み込みシステムを構築するためになぜそのコンプライアンスが必要なのかについて説明します。

C でコードを書いていると、一見正しいように見えて本質的に間違っているものを実装するのはとても簡単です。コードは問題なくコンパイルできるかもしれませんし、一定期間でも正常に動作するかもしれません。しかし、入力サイズやメモリが増えると、同じコードがクラッシュしたり、未定義の動作をしたりする可能性があります。たとえば、特定の入力番号によって整数がオーバーフローしたり、特定の文字シーケンスが原因で配列が範囲外になったりします。

そこで、MISRA C コーディング標準が役に立ちます。この規格によって定められた規則、ガイドライン、ベスト・プラクティスにより、開発者は組込み開発用の安全で信頼できる C コードを書くことができます。

この規格の最新版である MISRA C 2012 では、新しい規則が追加され、既存の規則が強化され、いくつかの相違点が修正されています。まだ古いバージョンを使用している場合は、今が切り替えの絶好の機会です。

MISRA C コーディング標準とはどのようなものですか?

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

しかし、それ以来、MISRAコンソーシアムはC++のコーディング標準も開発しています。すべての MISRA C 文書には、一連の規則、非準拠の例、および当該規則の開発に貢献した背景情報に関する詳細なセクションが含まれています。

CとC++は、組み込みソフトウェアの開発で最も広く使用されている言語です。その主な理由の 1 つは、これらの言語は高速で、機械語と比べて抽象化レベルが 1 ~ 2 レベルしかないことです。しかしこれは、特に C で安全なコードを書くのは難しく、間違いも起こりやすいということでもあります。たとえば、Java や C# などのほとんどの高級言語では、ガベージコレクションや動的型付けなどの些細なことを気にする必要はありません。

しかし、C言語では、ゴミを集めるための定義済みの方法はありません。つまり、データ構造にメモリを割り当てる場合、使い終わったら手動でメモリを解放する必要があります。そうしないと、C は他の言語とは異なり、メモリを解放しないため、メモリリークが発生します。

MISRA C 2004 (C2) 対 MISRA C 2012 (C3) — 何が変わったのか?

MISRA C: 2012はC3とも呼ばれ、2013年4月に初めてリリースされました。C3は、何千もの人々や組織の活動から得た知識を活用して、新しいルールを追加し、既存のルールの説明や背景を強化し、抜け穴を塞いでいます。

C3 は C99 バージョンの言語をサポートすると同時に、古い ISO C90 のルールも維持しています。C3 の主な焦点は、クリティカルなシステムで C 言語をより安全に使用できるようにすると同時に、ルール施行にかかる通常のコストを削減することでした。こうしたことから、まだ新しい標準に切り替えていない場合は、新しい標準に切り替えるのが賢明です。

全体として、最も重要な変更点は次のとおりです。

  • 2004 バージョンで見つかった問題を修正しました。
  • の数を大幅に増やす 決定可能なルール。 ルールは 決定可能、 分析ツールがそれへの適合性を判断するのに役立つかどうか。
  • ルールは「必須」、「勧告」、または「必須」に分類されます。強制ルールはいかなる状況においても決して破ってはなりません。特別なシナリオでは、違反が正当化される限り、必須規則や勧告規則に違反する可能性があります。
  • 自動生成コードにルールを適用する方法に関するガイダンスを追加しました。これは非常に重要です。なぜなら、人間が書いたコードと同じガイドラインが、ツールによって生成されたコードには必ずしも当てはまらないからです。
  • ユーザーの合理的な行動を妨げる過度に一般化されたルールを削除してください。たとえば、以前はマクロをまったく使用しないことが推奨されていました。マクロは、さまざまな問題や混乱を招く可能性があるためです (マクロをデバッグできない、マクロに名前空間がないなど)。これにより、マクロがエレガントで安全で便利なソリューションを提供できるような状況でも、マクロを使用できなくなりました。MISRA C: 2012 では、マクロに関する新しい規則が導入され、ユーザーはいつでもマクロを慎重に使用できるようになりました。MISRA C 文書から抜粋した次の抜粋では、関数ではなくマクロを使用することを推奨しています。

MISRA C ルールが実際に使われています

説明は以上です。次は、MISRA C のルールを、その適用方法の例とともに実際に使ってみましょう。

互換性のある型を memcpy、memmove、および memcmp へのポインタ引数として使用する

標準ライブラリ関数 メモリコピー、メモリムーブ、 そして memcmp バイト単位の移動または指定されたバイト数の比較を行います。MISRA C 2012 規格の規則 21.15 では、2 つの関数パラメータは同じ型へのポインタでなければならないと規定されています。互換性のないポインタ型を使った関数呼び出しは、間違いを示している可能性があります。

MISRA の公式コンプライアンス文書から抜粋した次の画像を見てください。ルールは 必須、決定可能、 C90とC99の両方に適用されます。

MISRA Cルール21.15のスクリーンショット

ルールの説明の次に例を示します。

非準拠のソリューションのスクリーンショット。

ご覧のように、オブジェクトは異なるタイプ (uint8_t と uint16_t) であるため、これは非準拠のソリューションです。

入力として長さをとらない文字列処理関数は、範囲外アクセスにはなりません

<string.h>その長さを入力として受け取らない文字列処理関数では、範囲外アクセスが発生しないはずです。関連する関数は strcat、strchr、strcmp、strcoll、strcpy、strcspn、strlen、strpbrk、strrchr、strspn、strrstr、strtok です。ルールは 必須、 つまり、どんな状況でも破ることはできないということです。これは C90 と C99 の両方に適用され、 決まらない。

MISRA Cルール21.17のスクリーンショット。

対応する例は次のとおりです。

文字列処理機能の正しい例のスクリーンショット

ご覧の通り、 ずんぐりした 関数 f1 では、5 文字しか格納できない文字列の長さを超えてコピーします。また、strcpy の仕様に準拠した安全な使い方もあります。strcpy では、「str」の内容が収まる場合にのみ文字列がコピーされます。

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

Dir 4.14では、「外部」ソースから受信したデータの有効性を確認することを推奨しています。外部入力には次のようなものがあります。

  • ファイルからの読み込み。
  • 環境変数から読み取ります。
  • 任意のユーザー入力。
  • 通信チャネルを介して受信したもの。たとえば、TCP 接続や HTTP API などを介して送信された場合などです。

この指令は 必須 カテゴリであり、C90とC99の両方に適用されます。その理由は、外部ソースから受信したデータをプログラムが制御できないため、このデータは無効または悪意のあるものである可能性があるということです。例えば、プログラムではユーザーが数字を入力することを期待しているのに、ユーザーが文字列を入力したとします。入力を処理する前に、プログラムは入力が実際に数値であることを確認する必要があります。

外部からの数値の妥当性を確認すること。

MISRA C 2012 に切り替える方法

MISRA C 2012 に切り替えるには、コーディングガイドラインドキュメントを更新する必要があります。これを使用せず、代わりに静的解析ツール (推奨選択肢) を使用している場合は、新しいバージョンのツールを入手しなければならない場合があります。MISRA C 2012 への準拠を確認するツールが 3 つあります。

  1. Cppcheck は、MISRA ルールをチェックしたり、さまざまな種類のバグを検出したりできるオープンソースツールです。
  2. PC-リントプラス は、30 日間の評価期間がある有料ツールです。MISRA C への準拠を確認するだけでなく、潜在的なバグや脆弱性を特定するのにも役立ちます。
  3. コードソナー は、MISRA C と C++ の両方への準拠をチェックするもう 1 つのツールです。

MISRA への準拠をテストできるコンパイラもいくつかあります。ルール違反が検出されると、それに応じて警告または例外が発生します。例えば グリーンヒルズソフトウェア は、32 ビットアーキテクチャと 64 ビットアーキテクチャの両方で、すべての MISRA 標準をサポートするコンパイラを提供します。

セキュアコードウォリアーを使用して MISRA C の開発者をスキルアップする

Secure Code Warriorの主力製品である学習プラットフォームには、開発者が安全なC/C++コードを書くためのトレーニングに役立つインタラクティブな課題、コース、評価が多数あります。プラットフォーム上のコンテンツはフレームワークに特化しており、非常に魅力的です。C/C++: Embed コーディングの課題は、MISRA C、AUTOSAR C++ (MISRA C++)、IEC の両方からインスピレーションを得たものです。

開発者は、C/C++固有の脆弱性を特定し、さらに重要なことに、それらのバグの修正方法を学ぶという、パーソナライズされた学習ジャーニーに乗り出すことができます。このプロセスでは、開発者は自分の弱点を特定するために進捗状況を追跡できるほか、同僚との友好的なコーディングコンテストを楽しむこともできます。詳細はこちらをご覧ください。 自動車および輸送産業への支援方法 私たちのソリューションで。

私たちの課題がどれほどインタラクティブで、埋め込みに焦点を当てているかを知りたいですか?試してみてください 一部の C/C++: 埋め込みの課題 今日は学習プラットフォームで!

オンラインセミナーを見る
始めよう
もっと詳しく

以下のリンクをクリックして、このリソースのPDFをダウンロードしてください。

Secure Code Warriorは、ソフトウェア開発ライフサイクル全体にわたってコードを保護し、サイバーセキュリティを最優先とする文化を築くお手伝いをします。アプリケーションセキュリティマネージャー、開発者、CISO、またはセキュリティ関係者であるかに関わらず、安全でないコードに関連するリスクを軽減するお手伝いをします。

レポートを表示デモを予約
PDFをダウンロード
リソースを表示
シェア:
リンクトインのブランドソーシャルx ロゴ
もっと興味がありますか?

シェア:
リンクトインのブランドソーシャルx ロゴ
著者
セキュアコード・ウォリアー
2021年8月17日発行

セキュアコード・ウォリアーは、開発者がスキルを向上させるにつれ、セキュアコーディングを前向きで魅力的な体験に変えます。セキュリティスキルを持つ開発者が、つながった世界で日常的にスーパーヒーローになれるよう、コーダー一人ひとりが望む学習経路へと導きます。

この記事は、Secure Code Warriorの業界専門家チームによって執筆されました。開発者が最初から安全なソフトウェアを構築するための知識とスキルを身につけることを目指しています。セキュア・コーディングの実践に関する深い専門知識、業界動向、現実世界の洞察を活用しています。

シェア:
リンクトインのブランドソーシャルx ロゴ

セキュア・コード・ウォリアーでは、常にトレーニング対象範囲の拡大を目指しています。組込み開発者とセキュリティ管理者が安全な組込みシステムを構築できるようにするために、私たちは組込みシステム・セキュリティの世界に参入しています。この投稿では、MISRA C 2012 標準と、安全な組み込みシステムを構築するためになぜそのコンプライアンスが必要なのかについて説明します。

C でコードを書いていると、一見正しいように見えて本質的に間違っているものを実装するのはとても簡単です。コードは問題なくコンパイルできるかもしれませんし、一定期間でも正常に動作するかもしれません。しかし、入力サイズやメモリが増えると、同じコードがクラッシュしたり、未定義の動作をしたりする可能性があります。たとえば、特定の入力番号によって整数がオーバーフローしたり、特定の文字シーケンスが原因で配列が範囲外になったりします。

そこで、MISRA C コーディング標準が役に立ちます。この規格によって定められた規則、ガイドライン、ベスト・プラクティスにより、開発者は組込み開発用の安全で信頼できる C コードを書くことができます。

この規格の最新版である MISRA C 2012 では、新しい規則が追加され、既存の規則が強化され、いくつかの相違点が修正されています。まだ古いバージョンを使用している場合は、今が切り替えの絶好の機会です。

MISRA C コーディング標準とはどのようなものですか?

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

しかし、それ以来、MISRAコンソーシアムはC++のコーディング標準も開発しています。すべての MISRA C 文書には、一連の規則、非準拠の例、および当該規則の開発に貢献した背景情報に関する詳細なセクションが含まれています。

CとC++は、組み込みソフトウェアの開発で最も広く使用されている言語です。その主な理由の 1 つは、これらの言語は高速で、機械語と比べて抽象化レベルが 1 ~ 2 レベルしかないことです。しかしこれは、特に C で安全なコードを書くのは難しく、間違いも起こりやすいということでもあります。たとえば、Java や C# などのほとんどの高級言語では、ガベージコレクションや動的型付けなどの些細なことを気にする必要はありません。

しかし、C言語では、ゴミを集めるための定義済みの方法はありません。つまり、データ構造にメモリを割り当てる場合、使い終わったら手動でメモリを解放する必要があります。そうしないと、C は他の言語とは異なり、メモリを解放しないため、メモリリークが発生します。

MISRA C 2004 (C2) 対 MISRA C 2012 (C3) — 何が変わったのか?

MISRA C: 2012はC3とも呼ばれ、2013年4月に初めてリリースされました。C3は、何千もの人々や組織の活動から得た知識を活用して、新しいルールを追加し、既存のルールの説明や背景を強化し、抜け穴を塞いでいます。

C3 は C99 バージョンの言語をサポートすると同時に、古い ISO C90 のルールも維持しています。C3 の主な焦点は、クリティカルなシステムで C 言語をより安全に使用できるようにすると同時に、ルール施行にかかる通常のコストを削減することでした。こうしたことから、まだ新しい標準に切り替えていない場合は、新しい標準に切り替えるのが賢明です。

全体として、最も重要な変更点は次のとおりです。

  • 2004 バージョンで見つかった問題を修正しました。
  • の数を大幅に増やす 決定可能なルール。 ルールは 決定可能、 分析ツールがそれへの適合性を判断するのに役立つかどうか。
  • ルールは「必須」、「勧告」、または「必須」に分類されます。強制ルールはいかなる状況においても決して破ってはなりません。特別なシナリオでは、違反が正当化される限り、必須規則や勧告規則に違反する可能性があります。
  • 自動生成コードにルールを適用する方法に関するガイダンスを追加しました。これは非常に重要です。なぜなら、人間が書いたコードと同じガイドラインが、ツールによって生成されたコードには必ずしも当てはまらないからです。
  • ユーザーの合理的な行動を妨げる過度に一般化されたルールを削除してください。たとえば、以前はマクロをまったく使用しないことが推奨されていました。マクロは、さまざまな問題や混乱を招く可能性があるためです (マクロをデバッグできない、マクロに名前空間がないなど)。これにより、マクロがエレガントで安全で便利なソリューションを提供できるような状況でも、マクロを使用できなくなりました。MISRA C: 2012 では、マクロに関する新しい規則が導入され、ユーザーはいつでもマクロを慎重に使用できるようになりました。MISRA C 文書から抜粋した次の抜粋では、関数ではなくマクロを使用することを推奨しています。

MISRA C ルールが実際に使われています

説明は以上です。次は、MISRA C のルールを、その適用方法の例とともに実際に使ってみましょう。

互換性のある型を memcpy、memmove、および memcmp へのポインタ引数として使用する

標準ライブラリ関数 メモリコピー、メモリムーブ、 そして memcmp バイト単位の移動または指定されたバイト数の比較を行います。MISRA C 2012 規格の規則 21.15 では、2 つの関数パラメータは同じ型へのポインタでなければならないと規定されています。互換性のないポインタ型を使った関数呼び出しは、間違いを示している可能性があります。

MISRA の公式コンプライアンス文書から抜粋した次の画像を見てください。ルールは 必須、決定可能、 C90とC99の両方に適用されます。

MISRA Cルール21.15のスクリーンショット

ルールの説明の次に例を示します。

非準拠のソリューションのスクリーンショット。

ご覧のように、オブジェクトは異なるタイプ (uint8_t と uint16_t) であるため、これは非準拠のソリューションです。

入力として長さをとらない文字列処理関数は、範囲外アクセスにはなりません

<string.h>その長さを入力として受け取らない文字列処理関数では、範囲外アクセスが発生しないはずです。関連する関数は strcat、strchr、strcmp、strcoll、strcpy、strcspn、strlen、strpbrk、strrchr、strspn、strrstr、strtok です。ルールは 必須、 つまり、どんな状況でも破ることはできないということです。これは C90 と C99 の両方に適用され、 決まらない。

MISRA Cルール21.17のスクリーンショット。

対応する例は次のとおりです。

文字列処理機能の正しい例のスクリーンショット

ご覧の通り、 ずんぐりした 関数 f1 では、5 文字しか格納できない文字列の長さを超えてコピーします。また、strcpy の仕様に準拠した安全な使い方もあります。strcpy では、「str」の内容が収まる場合にのみ文字列がコピーされます。

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

Dir 4.14では、「外部」ソースから受信したデータの有効性を確認することを推奨しています。外部入力には次のようなものがあります。

  • ファイルからの読み込み。
  • 環境変数から読み取ります。
  • 任意のユーザー入力。
  • 通信チャネルを介して受信したもの。たとえば、TCP 接続や HTTP API などを介して送信された場合などです。

この指令は 必須 カテゴリであり、C90とC99の両方に適用されます。その理由は、外部ソースから受信したデータをプログラムが制御できないため、このデータは無効または悪意のあるものである可能性があるということです。例えば、プログラムではユーザーが数字を入力することを期待しているのに、ユーザーが文字列を入力したとします。入力を処理する前に、プログラムは入力が実際に数値であることを確認する必要があります。

外部からの数値の妥当性を確認すること。

MISRA C 2012 に切り替える方法

MISRA C 2012 に切り替えるには、コーディングガイドラインドキュメントを更新する必要があります。これを使用せず、代わりに静的解析ツール (推奨選択肢) を使用している場合は、新しいバージョンのツールを入手しなければならない場合があります。MISRA C 2012 への準拠を確認するツールが 3 つあります。

  1. Cppcheck は、MISRA ルールをチェックしたり、さまざまな種類のバグを検出したりできるオープンソースツールです。
  2. PC-リントプラス は、30 日間の評価期間がある有料ツールです。MISRA C への準拠を確認するだけでなく、潜在的なバグや脆弱性を特定するのにも役立ちます。
  3. コードソナー は、MISRA C と C++ の両方への準拠をチェックするもう 1 つのツールです。

MISRA への準拠をテストできるコンパイラもいくつかあります。ルール違反が検出されると、それに応じて警告または例外が発生します。例えば グリーンヒルズソフトウェア は、32 ビットアーキテクチャと 64 ビットアーキテクチャの両方で、すべての MISRA 標準をサポートするコンパイラを提供します。

セキュアコードウォリアーを使用して MISRA C の開発者をスキルアップする

Secure Code Warriorの主力製品である学習プラットフォームには、開発者が安全なC/C++コードを書くためのトレーニングに役立つインタラクティブな課題、コース、評価が多数あります。プラットフォーム上のコンテンツはフレームワークに特化しており、非常に魅力的です。C/C++: Embed コーディングの課題は、MISRA C、AUTOSAR C++ (MISRA C++)、IEC の両方からインスピレーションを得たものです。

開発者は、C/C++固有の脆弱性を特定し、さらに重要なことに、それらのバグの修正方法を学ぶという、パーソナライズされた学習ジャーニーに乗り出すことができます。このプロセスでは、開発者は自分の弱点を特定するために進捗状況を追跡できるほか、同僚との友好的なコーディングコンテストを楽しむこともできます。詳細はこちらをご覧ください。 自動車および輸送産業への支援方法 私たちのソリューションで。

私たちの課題がどれほどインタラクティブで、埋め込みに焦点を当てているかを知りたいですか?試してみてください 一部の C/C++: 埋め込みの課題 今日は学習プラットフォームで!

目次

PDFをダウンロード
リソースを表示
もっと興味がありますか?

セキュアコード・ウォリアーは、開発者がスキルを向上させるにつれ、セキュアコーディングを前向きで魅力的な体験に変えます。セキュリティスキルを持つ開発者が、つながった世界で日常的にスーパーヒーローになれるよう、コーダー一人ひとりが望む学習経路へと導きます。

もっと詳しく

Secure Code Warriorは、ソフトウェア開発ライフサイクル全体にわたってコードを保護し、サイバーセキュリティを最優先とする文化を築くお手伝いをします。アプリケーションセキュリティマネージャー、開発者、CISO、またはセキュリティ関係者であるかに関わらず、安全でないコードに関連するリスクを軽減するお手伝いをします。

デモを予約[ダウンロード]
シェア:
リンクトインのブランドソーシャルx ロゴ
リソースハブ

始めるためのリソース

その他の投稿
リソースハブ

始めるためのリソース

その他の投稿