ISO/IEC TS 17961 [intptrconv]

Преобразование указателя на целое число или целое число к указателю

Описание

Управляйте определением

Преобразование указателя на целое число или целое число к указателю. [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 (-do-not-generate-results-for).

  • Указатель p брошен к целочисленным типам, таким как int32_t, bool_t или enum etag.

Правило не нарушено когда адрес &ui16 присвоен указателю.

Проверяйте информацию

Разрешимость: неразрешимый

Введенный в R2019a


[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.