Описание
Проблема происходит, когда преобразование выполняется между указателем на объект и целочисленным типом.
Броски или неявные преобразования из 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
присвоен указателю.