exponenta event banner

MISRA C:2012 Правило 11.4

Преобразование не должно выполняться между указателем на объект и целым типом

Описание

Определение правила

Преобразование не должно выполняться между указателем на объект и целым типом.

Объяснение

Преобразование между целыми числами и указателями может привести к ошибкам или неопределенному поведению.

  • При приведении целого числа к указателю результирующий указатель может быть неправильно выровнен. Неправильное выравнивание приводит к неопределенному поведению.

  • Если указатель приводится к целому числу, результирующее значение может находиться за пределами допустимого диапазона для целочисленного типа.

Внедрение 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 назначается указателю.

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

Группа: Преобразования типов указателей
Категория: Консультационные услуги
СМЖЛ Категория: Консультативные услуги
Представлен в R2014b