メインコンテンツ

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

MISRA C:2023 Rule 10.8

The value of a composite expression shall not be cast to a different essential type category or a wider essential type

R2024a 以降

説明

ルール定義

The value of a composite expression shall not be cast to a different essential type category or a wider essential type 1 .

根拠

"複合式" は複合演算子を使用した非定数式です。実質的な型モデルでは、複合演算子は以下になります。

  • 乗算 (*/%)

  • 加算 (二項 +、二項 -)

  • ビット単位 (&|^)

  • シフト (<<>>)

  • 条件 (?:)

~ などの単項演算子と単項の + または - も、複合演算子と見なされます。

より範囲が広い型へのキャストは、実装によって結果が異なる可能性があるため許可されません。たとえば、次の式を考えてみます。

(uint32_t) (u16a +u16b);
16 ビット マシン上では 16 ビットで加算が実行されます。結果はラップされてから 32 ビットにキャストされます。32 ビット マシンでは、加算は 32 ビットで実行され、16 ビット マシンでは失われる高次ビットが保持されます。より範囲が狭い同じ実質的な型カテゴリの型へのキャストは、結果の明示的な切り捨てが常に同じ情報の損失となるため許容されます。

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

Polyspace 実装

複合式の結果が、異なる実質的な型またはより範囲が広い実質的な型に "直接" キャストされる場合にのみ、ルール チェッカーは違反を報告します。単項演算子は複合演算子と見なされません。

たとえば、この例では、i への最初の代入では違反が示されますが、2 番目の代入では示されません。最初の代入では、複合式 i+1 が符号付き型から符号なし型に直接キャストされています。2 番目の代入では、まず複合式が同じ型にキャストされ、次にその結果が別の型にキャストされています。この複合式は別の型に直接キャストされないため、チェッカーは違反を報告しません。

typedef int int32_T;
typedef unsigned char uint8_T; 
...
...
int32_T i;
i = (uint8_T)(i+1); /* Noncompliant */
i = (uint8_T)((int32_T)(i+1)); /* Compliant */

Polyspace® は、次の場合にはこのルールに対する違反を報告しません。

  • 実質的な実数の浮動小数点型の式が、実質的な複素数の浮動小数点型にキャストされるが、複素型の対応する実数型の範囲が、実数の式の型よりも広くない場合。

  • 実質的な実数の複素式が、実質的な実数の浮動小数点型にキャストされるが、この浮動小数点型の範囲が、対応する複素式の実数型よりも広くない場合。

トラブルシューティング

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

すべて展開する

この例では、以下の場合においてルール 10.8 に違反しています。

#include <stdint.h>
#include <complex.h>
extern unsigned short ru16a, u16a, u16b;
extern unsigned int   u32a, ru32a;
extern signed int     s32a, s32b;

void foo(void)
{
  ru16a  = (unsigned short) (u32a + u32a);/* Compliant                           */
  ru16a += (unsigned short) s32a;    /* Compliant - s32a is not composite        */
  ru32a  = (unsigned int) (u16a + u16b);  /* Noncompliant - wider essential type */
}

void bar(int8_t i8x, int8_t i8y, float fx, float fy){
	
	(_Complex float) (i8x + i8y);      /* Noncompliant - wider essential type */ 
	 (_Complex float) (fx + fy);       /* Compliant                           */    
}

  • s32as32b は実質的な signed 変数である。しかし、この結果 ( s32a + s32b ) は、実質的な unsigned 型にキャストされる。

  • u16au16b は実質的な unsigned short 変数である。しかし、この結果 ( s32a + s32b ) は、範囲がより広い実質的な型 unsigned int にキャストされる。

  • i8xi8y は実質的には 8 ビットの符号付き整数ですが、範囲がより広い実質的な型 _complex float に変換されます。

チェック情報

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