SCW-Symbole
Held-Hintergrund ohne Trennlinie
Blog

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

Secure Code Warrior
Veröffentlicht Aug 17, 2021
Zuletzt aktualisiert am 10. März 2026

セキュア・コード・ウォリアーでは、常にトレーニング対象範囲の拡大を目指しています。組込み開発者とセキュリティ管理者が安全な組込みシステムを構築できるようにするために、私たちは組込みシステム・セキュリティの世界に参入しています。この投稿では、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の両方に適用されます。

Screenshot der MISRA C-Regel 21.15

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

Screenshot einer nicht konformen Lösung.

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

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

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

Screenshot von MISRA C Regel 21.17.

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

Screenshot eines korrekten Beispiels von Funktionen zur Behandlung von Zeichenketten

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

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

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

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

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

Die Gültigkeit der aus externen Quellen erhaltenen Werte ist zu überprüfen

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 macht sicheres Codieren zu einer positiven und attraktiven Erfahrung, während Entwickler ihre Fähigkeiten verbessern. Es führt jeden einzelnen Programmierer auf den von ihm gewünschten Lernpfad, damit Entwickler mit Sicherheitskenntnissen in unserer vernetzten Welt täglich zu Superhelden werden können.

mehr erfahren

Secure Code Warrior schützt Ihren Code während des gesamten Softwareentwicklungszyklus und hilft Ihnen dabei, eine Kultur zu schaffen, in der Cybersicherheit oberste Priorität hat. Ganz gleich, ob Sie Anwendungs-Sicherheitsmanager, Entwickler, CISO oder Sicherheitsbeauftragter sind – wir helfen Ihnen dabei, die mit unsicherem Code verbundenen Risiken zu minimieren.

デモを予約
シェア:
LinkedIn-MarkenSozialx Logo
Autor
Secure Code Warrior
Veröffentlicht Aug 17, 2021

Secure Code Warrior macht sicheres Codieren zu einer positiven und attraktiven Erfahrung, während Entwickler ihre Fähigkeiten verbessern. Es führt jeden einzelnen Programmierer auf den von ihm gewünschten Lernpfad, damit Entwickler mit Sicherheitskenntnissen in unserer vernetzten Welt täglich zu Superhelden werden können.

Dieser Artikel wurde vom Branchenexperten-Team von Secure Code Warrior verfasst. Er zielt darauf ab, Entwicklern das Wissen und die Fähigkeiten zu vermitteln, die sie benötigen, um von Anfang an sichere Software zu entwickeln. Dabei werden fundierte Fachkenntnisse über die Praxis des sicheren Codierens, Branchentrends und Einblicke aus der Praxis genutzt.

シェア:
LinkedIn-MarkenSozialx Logo

セキュア・コード・ウォリアーでは、常にトレーニング対象範囲の拡大を目指しています。組込み開発者とセキュリティ管理者が安全な組込みシステムを構築できるようにするために、私たちは組込みシステム・セキュリティの世界に参入しています。この投稿では、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の両方に適用されます。

Screenshot der MISRA C-Regel 21.15

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

Screenshot einer nicht konformen Lösung.

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

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

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

Screenshot von MISRA C Regel 21.17.

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

Screenshot eines korrekten Beispiels von Funktionen zur Behandlung von Zeichenketten

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

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

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

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

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

Die Gültigkeit der aus externen Quellen erhaltenen Werte ist zu überprüfen

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++: 埋め込みの課題 今日は学習プラットフォームで!

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

Um den Bericht herunterzuladen, füllen Sie bitte das folgende Formular aus.

Wir bitten um Ihre Erlaubnis, Ihnen Informationen zu unseren Produkten und/oder zu Themen rund um sicheres Programmieren zuzusenden. Wir behandeln Ihre personenbezogenen Daten stets mit größter Sorgfalt und verkaufen sie niemals zu Marketingzwecken an andere Unternehmen weiter.

送信
scw Erfolgssymbol
scw-Fehlersymbol
Um das Formular zu senden, aktivieren Sie bitte das „Analytics“-Cookie. Nach Abschluss der Einstellungen können Sie es wieder deaktivieren.

セキュア・コード・ウォリアーでは、常にトレーニング対象範囲の拡大を目指しています。組込み開発者とセキュリティ管理者が安全な組込みシステムを構築できるようにするために、私たちは組込みシステム・セキュリティの世界に参入しています。この投稿では、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の両方に適用されます。

Screenshot der MISRA C-Regel 21.15

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

Screenshot einer nicht konformen Lösung.

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

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

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

Screenshot von MISRA C Regel 21.17.

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

Screenshot eines korrekten Beispiels von Funktionen zur Behandlung von Zeichenketten

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

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

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

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

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

Die Gültigkeit der aus externen Quellen erhaltenen Werte ist zu überprüfen

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++: 埋め込みの課題 今日は学習プラットフォームで!

Online-Seminar ansehen
Beginnen wir
mehr erfahren

Klicken Sie auf den folgenden Link, um die PDF-Datei dieser Ressource herunterzuladen.

Secure Code Warrior schützt Ihren Code während des gesamten Softwareentwicklungszyklus und hilft Ihnen dabei, eine Kultur zu schaffen, in der Cybersicherheit oberste Priorität hat. Ganz gleich, ob Sie Anwendungs-Sicherheitsmanager, Entwickler, CISO oder Sicherheitsbeauftragter sind – wir helfen Ihnen dabei, die mit unsicherem Code verbundenen Risiken zu minimieren.

Bericht anzeigenデモを予約
PDF herunterladen
リソースを表示
シェア:
LinkedIn-MarkenSozialx Logo
もっと興味がありますか?

シェア:
LinkedIn-MarkenSozialx Logo
Autor
Secure Code Warrior
Veröffentlicht Aug 17, 2021

Secure Code Warrior macht sicheres Codieren zu einer positiven und attraktiven Erfahrung, während Entwickler ihre Fähigkeiten verbessern. Es führt jeden einzelnen Programmierer auf den von ihm gewünschten Lernpfad, damit Entwickler mit Sicherheitskenntnissen in unserer vernetzten Welt täglich zu Superhelden werden können.

Dieser Artikel wurde vom Branchenexperten-Team von Secure Code Warrior verfasst. Er zielt darauf ab, Entwicklern das Wissen und die Fähigkeiten zu vermitteln, die sie benötigen, um von Anfang an sichere Software zu entwickeln. Dabei werden fundierte Fachkenntnisse über die Praxis des sicheren Codierens, Branchentrends und Einblicke aus der Praxis genutzt.

シェア:
LinkedIn-MarkenSozialx Logo

セキュア・コード・ウォリアーでは、常にトレーニング対象範囲の拡大を目指しています。組込み開発者とセキュリティ管理者が安全な組込みシステムを構築できるようにするために、私たちは組込みシステム・セキュリティの世界に参入しています。この投稿では、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の両方に適用されます。

Screenshot der MISRA C-Regel 21.15

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

Screenshot einer nicht konformen Lösung.

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

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

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

Screenshot von MISRA C Regel 21.17.

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

Screenshot eines korrekten Beispiels von Funktionen zur Behandlung von Zeichenketten

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

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

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

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

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

Die Gültigkeit der aus externen Quellen erhaltenen Werte ist zu überprüfen

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 herunterladen
リソースを表示
もっと興味がありますか?

Secure Code Warrior macht sicheres Codieren zu einer positiven und attraktiven Erfahrung, während Entwickler ihre Fähigkeiten verbessern. Es führt jeden einzelnen Programmierer auf den von ihm gewünschten Lernpfad, damit Entwickler mit Sicherheitskenntnissen in unserer vernetzten Welt täglich zu Superhelden werden können.

mehr erfahren

Secure Code Warrior schützt Ihren Code während des gesamten Softwareentwicklungszyklus und hilft Ihnen dabei, eine Kultur zu schaffen, in der Cybersicherheit oberste Priorität hat. Ganz gleich, ob Sie Anwendungs-Sicherheitsmanager, Entwickler, CISO oder Sicherheitsbeauftragter sind – wir helfen Ihnen dabei, die mit unsicherem Code verbundenen Risiken zu minimieren.

デモを予約[ダウンロード]
シェア:
LinkedIn-MarkenSozialx Logo
リソースハブ

Ressourcen für den Einstieg

Weitere Beiträge
リソースハブ

Ressourcen für den Einstieg

Weitere Beiträge