メインコンテンツ

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

MISRA C:2012 Rule 11.4

A conversion should not be performed between a pointer to object and an integer type

説明

ルール定義

A conversion should not be performed between a pointer to object and an integer type 1 .

根拠

整数とポインターの間の変換はエラーまたは未定義の動作を引き起こす可能性があります。

  • 整数がポインターにキャストされると、結果のポインターは正しく配置されない可能性があります。不適切なアライメントは未定義の動作を発生させます。

  • ポインターが整数にキャストされると、結果の値は整数型に許可された範囲から外れる可能性があります。

Polyspace 実装

NULL または (void*)0 からのキャストまたは暗黙的な変換は警告を生成しません。

トラブルシューティング

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

すべて展開する

#include <stdbool.h>

typedef unsigned char      uint8_t;
typedef          char      char_t;
typedef unsigned short     uint16_t;
typedef signed   int       int32_t;

typedef _Bool bool_t;
uint8_t *PORTA = (uint8_t *) 0x0002;            /* Non-compliant */

void foo(void) {

    char_t c = 1;
    char_t *pc = &c;                              /* Compliant */


    uint16_t ui16   = 7U;
    uint16_t *pui16 = &ui16;                      /* Compliant */
    pui16 = (uint16_t *) ui16;                    /* Non-compliant */


    uint16_t *p;
    int32_t addr = (int32_t) p;                  /* Non-compliant */
    bool_t b = (bool_t) p;                       /* Non-compliant */
    enum etag { A, B } e = ( enum etag ) p;      /* Non-compliant */
}

この例では、次の場合にこのルールに違反します。

  • 整数 0x0002 がポインターにキャストされる。

    整数により絶対アドレスを定義する場合、アドレスをヘッダー ファイル内のポインターに代入する方が一般的です。代入に対するフラグを回避するために、ヘッダー ファイルをコーディング ルール チェックから除外できます。詳細は、次に対する結果を生成しない (-do-not-generate-results-for) を参照してください。

  • ポインター pint32_tbool_t または enum etag などの整数型にキャストされる。

アドレス &ui16 がポインターに代入される場合、ルールに違反しません。

チェック情報

グループ: Pointer Type Conversions
カテゴリ: 推奨
AGC カテゴリ: 推奨

バージョン履歴

R2014b で導入


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.