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