exponenta event banner

CERT C: EXP39-C правил

Не обращаться к переменной через указатель несовместимого типа

Описание

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

Не обращаться к переменной через указатель несовместимого типа. [1 ]

Внедрение Polyspace

Эта проверка проверяет наличие указателя Cast to, указывающего на объект другого типа.

Примеры

развернуть все

Проблема

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

Риск

Если указатель на объект помещается в указатель на другой объект, результирующий указатель может быть неправильно выровнен. Неправильное выравнивание приводит к неопределенному поведению.

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

Исключение: можно преобразовать указатель на тип объекта в указатель на один из следующих типов:

  • char

  • signed char

  • unsigned char

Пример - Несоответствие: Приведение к указателю, указывающему на объект более широкого типа
signed   char *p1;
unsigned int *p2;

void foo(void){ 
  p2 = ( unsigned int * ) p1;     /* Non-compliant */				
}

В этом примере: p1 может указывать на signed char объект. Однако p1 приводится к указателю, который указывает на объект более широкого типа, unsigned int.

Пример - Несоответствие: Приведение к указателю, указывающему на объект более узкого типа
extern unsigned int read_value ( void );
extern void display ( unsigned int n );

void foo ( void ){
  unsigned int u = read_value ( );
  unsigned short *hi_p = ( unsigned short * ) &u;    /* Non-compliant  */	
  *hi_p = 0;                                         
  display ( u );                                     
}

В этом примере: u является unsigned int переменная. &u приводится к указателю, который указывает на объект более узкого типа, unsigned short.

На машине big-endian, заявление *hi_p = 0 пытается очистить старшие биты ячейки памяти, которая &u указывает на. Но, из результата display(u), вы можете обнаружить, что старшие биты не были очищены.

Пример - Соответствие: Cast добавление квалификатора типа
const short *p;
const volatile short *q;
void foo (void){
  q = ( const volatile short * ) p;  /* Compliant */								
}

В этом примере оба p и q может указывать на short объекты. Отливка между ними добавляет volatile только квалификатор и поэтому соответствует.

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

Группа: Правило 03. Выражения (EXP)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.