メインコンテンツ

MISRA C:2023 Rule 11.2

Conversions shall not be performed between a pointer to an incomplete type and any other type

R2024a 以降

説明

ルール定義

Conversions shall not be performed between a pointer to an incomplete type and any other type 1 .

根拠

不完全な型とは、サイズを決定するための十分な情報がない型です。たとえば、ステートメント struct s;s のフィールドが定義されていないため、不完全な型が記述されています。s 型の変数のサイズは判別できません。

ポインターから不完全な型へ、あるいは不完全な型への変換では未定義の動作が発生します。通常、不完全な型へのポインターはオブジェクトの完全な表現を隠蔽するのに使用されます。別のポインターが暗黙的または明示的にそのようなポインターにキャストされるとこのカプセル化は壊れます。

トラブルシューティング

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

すべて展開する

#include <stdio.h> 
struct s *sp;
struct t *tp;
short  *ip;
struct ct *ctp1;
struct ct *ctp2;


void foo(void) {

    ip = (short *) sp;            /* Non-compliant */
    sp = (struct s *) 1234;       /* Non-compliant */
    tp = (struct t *) sp;         /* Non-compliant */
    ctp1 = (struct ct *) ctp2;    /* Compliant */

    /* You can convert a null pointer constant to 
     * a pointer to an incomplete type */
    sp = NULL;                    /* Compliant - exception  */

    /* A pointer to an incomplete type may be converted into void */
    struct s *f(void);
    (void) f();                   /* Compliant - exception  */

}

この例では、s 型、t 型および ct 型は不完全です。次の場合、このルールに違反します。

  • 不完全な型をもつ変数 sp が基本型にキャストされる。

  • 不完全な型をもつ変数 sp が別の不完全な t 型にキャストされる。

次の場合、このルールに違反しません。

  • 不完全な型をもつ変数 ctp2 が同じ不完全な型にキャストされる。

  • NULL ポインターが不完全な型をもつ変数 sp にキャストされる。

  • 不完全な型をもつ f の戻り値が void にキャストされる。

チェック情報

グループ: Pointer Type Conversions
カテゴリ: 必要
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.