メインコンテンツ

MISRA C:2012 Rule 10.7

If a composite expression is used as one operand of an operator in which the usual arithmetic conversions are performed then the other operand shall not have wider essential type

説明

If a composite expression is used as one operand of an operator in which the usual arithmetic conversions are performed, then the other operand shall not have wider essential type 1 .

根拠

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

  • 乗算 (*/%)

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

  • ビット単位 (&|^)

  • シフト (<<>>)

  • 条件 (?:)

複合式での暗黙的な変換を制限するということは、式内の一連の算術演算が同じ実質的な型を使用しなければならないことを意味します。この制限により混乱を低減し、値、符号、精度またはレイアウトの損失を回避します。ただし、このルールは式内のすべてのオペランドが同じ実質的な型であると示すものではありません。

実質的な実数の浮動小数点型と実質的な複素数の浮動小数点型の間で算術演算を実行することは、このルールの違反になりません。

実質的な型の詳細については、MISRA C ルール チェックで使用される実質的な型モデルを参照してください。

Polyspace 実装

複合式のオペランドが、より範囲が広い実質的な型に暗黙的に変換される場合、Polyspace® はこのルールの違反を報告します。

Polyspace は、ポインター演算と、実質的な実数の浮動小数点型および実質的な複素数の浮動小数点型の間での変換に対しては、このルールの違反を報告しません。

トラブルシューティング

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

すべて展開する

次の例は、複合式での準拠している算術演算と準拠していない算術演算を示します。

#include <stdint.h>
#include <complex.h>
void foo() {
	uint16_t u16x = 0, u16y = 0;
	uint32_t u32x = 0, u32y = 0;
	u32x * (u16x + u16y);         // Noncompliant
	u32x = (u16x + u16y) + u32x;  // Noncompliant
	

}


void bar() {
	_Complex float cx;
	_Complex double dx;
	float f;
	double d;

	cx + f;         // Compliant
	cx + d;         // Compliant
}

foo() では、オペランドが範囲のより広い実質的な型に暗黙的に変換されると Polyspace は違反を報告します。bar() では、複合式によって実質的な実数の浮動小数点型の数値が実質的な複素数の浮動小数点型の数値に暗黙的に変換されます。この暗黙的な変換は準拠しています。

チェック情報

グループ: 実質的な型モデル
カテゴリ: 必要
AGC カテゴリ: 推奨
PQL 名: std.misra_c_2012.R10_7

バージョン履歴

すべて展開する


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.