このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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);
実質的な型についての詳細は、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® は、次の場合にはこのルールに対する違反を報告しません。
実質的な実数の浮動小数点型の式が、実質的な複素数の浮動小数点型にキャストされるが、複素型の対応する実数型の範囲が、実数の式の型よりも広くない場合。
実質的な実数の複素式が、実質的な実数の浮動小数点型にキャストされるが、この浮動小数点型の範囲が、対応する複素式の実数型よりも広くない場合。
トラブルシューティング
ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。
例
チェック情報
グループ: 実質的な型モデル |
カテゴリ: 必要 |
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.