メインコンテンツ

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

MISRA C:2023 Rule 21.23

All operand arguments to any multi-argument type-generic macros declared in <tgmath.h> shall have the same standard type

R2024a 以降

説明

ルール定義

All operand arguments to any multi-argument type-generic macros declared in <tgmath.h> shall have the same standard type 1 .

根拠

ジェネリック型のマクロの引数のすべてに同じ標準の型を使用すると、マクロ式の評価で使用される型が明確になります。

たとえば、pow() マクロの両方の引数に float 変数を使用すれば、このマクロ式の評価が float 型の精度の要件に従うことが明確になります。一方、片方の引数が float で、もう片方の引数が double である場合、評価でどの型が使用されるのかが明確ではありません。

拡張された実数型を使用するプラットフォームでは、浮動小数点データ型が精度を基準に厳密に順序付けられていない場合があるため、マクロ式の評価で使用される型によって、実際に桁落ちが生じる可能性もあります。

Polyspace 実装

tgmath.h で宣言されたジェネリック型のマクロの引数のすべてで、(整数プロモーションが整数型に適用された後に) 同じ標準の型が使用されない場合、ルール チェッカーは違反を報告します。たとえば、ルール チェッカーは次の場合に違反を報告します。

  • 一方の引数が整数型で、もう一方の引数が浮動小数点型である。

  • (整数プロモーションが適用された後に) 一方の引数が整数型で、もう一方の引数がそれとは異なる種類の整数型である。たとえば、一方の引数の型が charshort、または int で、もう一方の引数の型が long である場合。

  • 一方の引数が実質的な実数の浮動小数点型で、もう一方の引数が実質的な複素数の浮動小数点型である。実質的な型についての詳細は、MISRA C:2012 Rule 10.1 を参照してください。

  • 一方の引数が浮動小数点型で、もう一方の引数がそれとは異なるサイズの浮動小数点型である。

frexp などの一部の関数では、最後の引数が出力引数として使用されるように意図されています。ルール チェッカーはルールの違反をチェックするときに、この出力引数をスキップします。

トラブルシューティング

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

すべて展開する

この例では、マクロ pow() が 4 回呼び出されます。

  • 最初の 3 回の呼び出しはこのルールに準拠しています。(整数プロモーションが整数型の引数に適用された後に) このマクロの引数がすべて同じデータ型だからです。

    3 回目の呼び出しでは、最初の引数の型が int で、2 番目の引数の型が、int にプロモートされる char となっています。したがって、この呼び出しもルールに準拠しています。

  • 最後の呼び出しは、最初の引数の型が double で、2 番目の引数の型が float であるため、このルールに違反しています。

#include <tgmath.h>

float fBase, fExp;
double dBase, dExp;
char cExp;
int iBase, iRes;
double res, dRes, fRes;

void calculatePower(void) { 
    fRes = pow(fBase, fExp);   //Compliant
    dRes = pow(dBase, dExp);   //Compliant
    iRes = pow(iBase, cExp);   //Compliant
    res = pow(dBase, fExp);    //Noncompliant
}

チェック情報

グループ: 標準ライブラリ
カテゴリ: 必要
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.