メインコンテンツ

MISRA C:2023 Dir 4.14

The validity of values received from external sources shall be checked

R2024a 以降

説明

命令の定義

The validity of values received from external sources shall be checked. 1

This rule comes from MISRA C™:2012 Amendment 1.

根拠

外部ソースから得る値は、エラーや攻撃者による意図的な変更が原因で無効なものになる可能性があります。データを使用する前に、そのデータの妥当性をチェックしなければなりません。

次に例を示します。

  • 外部入力を配列インデックスとして使用する前に、その入力が配列の値域エラーの原因になる可能性があるかどうかをチェックしなければなりません。

  • 外部変数をループの制御に使用する前に、その変数が無限ループになる可能性があるかどうかをチェックしなければなりません。

Polyspace 実装

ルール チェッカーは次の問題を検出します。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

#include <stdio.h>

void f1(char from_user[])
{
        char input [128];
        (void) sscanf (from_user, "%128c", input);
        (void) sprintf ("%s", input);/*Noncompliant*/
}

この例の sscanf ステートメントは、ユーザー入力が確実に null 終端されていることをチェックしていないため、準拠していません。文字列を出力する次の sprintf ステートメントは、配列の値域エラー (バッファー オーバーラン) につながる可能性があります。

この例では、関数の scanf()fgets() が 2 つの char 配列を読み取ってから、printf() を呼び出してこれらの配列を出力します。入力文字列は外部から取得されるため、不確定であるか、または null 終端文字が含まれていない可能性があります。printf() を使用してこのような文字列を出力すると、未定義の動作が発生する可能性があります。Polyspace® はこのルールに対する違反を報告します。


#include <stdio.h>
void echo_in() {
       //...
    char buffer[10];
    scanf("%10c", buffer);
	//...
    printf("%s", buffer); //Noncompliant - buffer is not null-terminated
	//...
    fgets(buffer, sizeof(buffer), stdin);
      //...
    printf("%s",buffer); //Noncompliant - buffer might be indeterminate
}

チェック情報

グループ: Code design
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

R2024a で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.