メインコンテンツ

ISO/IEC TS 17961 [intptrconv]

Converting a pointer to integer or integer to pointer

説明

ルール定義

ポインターを整数に、または整数をポインターに変換します。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 がポインターに代入される場合、ルールに違反しません。

チェック情報

決定可能性:決定不可能

バージョン履歴

R2019a で導入


1 Extracts from the standard "ISO/IEC TS 17961 Technical Specification - 2013-11-15" are reproduced with the agreement of AFNOR. Only the original and complete text of the standard, as published by AFNOR Editions - accessible via the website www.boutique.afnor.org - has normative value.