メインコンテンツ

MISRA C:2023 Rule 21.22

All operand arguments to any type-generic macros declared in <tgmath.h> shall have an appropriate essential type

R2024a 以降

説明

ルール定義

All operand arguments to any type-generic macros declared in <tgmath.h> shall have an appropriate essential type 1 .

根拠

tgmath.h で宣言されたジェネリック型のマクロは、実質的な符号付き型、実質的な符号なし型、または実質的な浮動小数点型の引数のみをサポートします。他の型の引数を使用すると、未定義の動作になります。実質的な型についての詳細は、MISRA C:2012 Rule 10.1 を参照してください。

これらのマクロのサブセットでは、実質的な複素数の浮動小数点型の引数を使用できません。たとえば、関数 atan2() は複素数の引数をサポートしません。これらのマクロで、実質的な複素数の浮動小数点型の引数を使用すると、未定義の動作になります。

Polyspace 実装

tgmath.h で宣言されたマクロが、次のいずれかのデータ型の引数とともに使用されている場合、ルール チェッカーは違反を報告します。

  • 実質的な文字型。

  • 実質的な boolean 型。

  • 実質的な enum 型。

  • 実質的な複素数の浮動小数点型 (マクロが複素数の浮動小数点型の引数をサポートしていない場合)。

トラブルシューティング

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

すべて展開する

この例では、マクロ sqrt()tgmath.g から 4 回呼び出されます。

  • 最初の 2 回の呼び出しは、それぞれ実質的な浮動小数点型の引数と実質的な符号付き型の引数を使用しており、このルールに準拠しています。

  • 最後の 2 回の呼び出しは、それぞれ実質的な文字型の引数と実質的な enum 型の引数を使用しているため、このルールに違反しています。

#include<tgmath.h>

float fInput, fRes;
int iInput, iRes;

char cInput, cRes;

typedef enum number {
    ZERO,
    ONE,
    TWO
} number;

number numberInput, numberRes;

void sqrtOps(void) {
    fRes = sqrt(fInput);             // Compliant
    iRes = sqrt(iInput);             // Compliant
    cRes = sqrt(cInput);             // Noncompliant
    numberRes = sqrt(numberInput);   // Noncompliant
}

チェック情報

グループ: 標準ライブラリ
カテゴリ: Mandatory
AGC カテゴリ: Mandatory

バージョン履歴

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.