メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C:2023 Rule 10.3

The value of an expression shall not be assigned to an object with a narrower essential type or of a different essential type category

R2024a 以降

説明

ルール定義

The value of an expression shall not be assigned to an object with a narrower essential type or of a different essential type category 1 .

根拠

異なる型の間で暗黙的な変換を使用すると、値、符号、精度の損失の可能性を含め、意図しない結果を引き起こす場合があります。

実質的な型についての詳細は、MISRA C Rule 10.x の実質的な型を参照してください。

Polyspace 実装

式の値が次のいずれかのデータ型の変数に代入される場合、ルール チェッカーが違反を報告します。

  • より範囲が狭い実質的な型の変数。たとえば、unsigned int (32 ビット) から unsigned short (16 ビット) への代入。

  • 異なる実質的な型カテゴリの変数。たとえば、_Bool (実質的な boolean 型) から unsigned int (実質的な符号なし型) への代入。

    実質的な型カテゴリについての詳細は、MISRA C:2012 Rule 10.1 を参照してください。

以下の場合、ルール チェッカーはこのルールの違反を報告しません。

  • オブジェクトがその実質的な型に対応する定数 0 に代入される場合。許容される 0 値は、整数型の場合は 0double の場合は 0.0char の場合は '\0' です。

  • 次のように、配列などの集約型の変数が省略表記 {0} を使用して初期化される場合。

    float dat2[3*3] = {0};

  • マクロ TRUE/true および FALSE/false が、対応するブール値とともに bool 変数に代入される場合。これらのマクロのスペルに大文字小文字が混在する場合、Polyspace® は違反を報告します。

  • 符号付き定数が符号なし変数に割り当てられている一方、符号付き定数がそれと等価の符号なしの値と同じ表現である場合。たとえば、チェッカーは次のようなステートメントにはフラグを設定しません。

    unsigned int u = 1;

  • 複素オブジェクトに対応する実数型のサイズで実数の式を格納できるときに、実質的な実数の浮動小数点型の式が、実質的な複素数の浮動小数点型のオブジェクトに代入される場合。以下に例を示します。

    float32_t f32a;
    _Complex float32_t cf32a;
    cf32a = f32a;
    複素オブジェクト cf32a に対応する実数型が float32_t であり、これは f32a を格納できます。この代入は、例外としてこのルールに準拠します。

コード生成ツールがブール値 true/false と整数リテラル 1/0 を相互互換的に使用する可能性がある場合、このルールの違反となります。このルールは、AGC モードで使用する場合は推奨であるため、このような欠陥を正当化することもできます。コードへの注釈付けと既知の結果または許容可能な結果の非表示を参照してください。

トラブルシューティング

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

すべて展開する

#include<stdint.h>
#include <stdbool.h>
#define FALSE 0 /*Noncompliant*/
#define TRUE 1
void init_integer(){
	int8_t a1= 0;
	int16_t a2= 0;
	int32_t a3= 0;
	uint8_t a4= 0;
	uint16_t a5= 0;
	uint32_t a6= 0;
}
void initiate(){
	float b = 0.0/*Noncompliant*/;
	double c = 0.0;
	bool flag1 = FALSE;
	bool flag2 = FALSE;
	char ch = 0 /*Noncompliant*/;
	char ch2 = '\0';
	unsigned char uch = 0;
}

この例は、定数 0 を使用して変数を初期化する方法を示しています。

  • さまざまなサイズの整数型で、0 による変数の初期化はこのルールに準拠しています。

  • 0.0 による double の初期化と '\0' による char の初期化も、このルールに準拠しています。

  • char の実質的な型は整数型ではないため、0 になっている char オブジェクト ch の初期化はこのルールに準拠していません。

  • unsigned char の実質的な型は整数型です。0 による unsigned char uch の初期化はこのルールに準拠しています。

  • 符号付き整数定数である 0 を使用した bool 変数の初期化は、このルールに対する違反です。

チェック情報

グループ: 実質的な型モデル
カテゴリ: 必要
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.