В Linux исходных кодах ядра есть некоторый индикатор, называемый ZERO_SIZE_PTR
для обозначения запросов kmallo c нулевого размера. Но также есть макрос ZERO_OR_NULL_PTR()
, который проверяет некоторый указатель, если он «нулевого размера» или «NULL». Код:
/*
* ZERO_SIZE_PTR will be returned for zero sized kmalloc requests.
*
* Dereferencing ZERO_SIZE_PTR will lead to a distinct access fault.
*
* ZERO_SIZE_PTR can be passed to kfree though in the same way that NULL can.
* Both make kfree a no-op.
*/
#define ZERO_SIZE_PTR ((void *)16)
#define ZERO_OR_NULL_PTR(x) ((unsigned long)(x) <= \
(unsigned long)ZERO_SIZE_PTR)
Проверка выглядит как ptr <= (void *)16
.
Проще говоря, это означает, что NULL-указатель является указателем от 0
до 15
, а указатель нулевого размера - 16
.
Так что указатели от 17
и выше должны быть действительными. Это правильно, что 15
недействительно (NULL), но 17
допустимо? Мне кажется, что действительные указатели начинаются не с 17, а с более высоких чисел.
Я имею в виду, возможно, будет более логичным проверить такой способ x == NULL || x == ZERO_SIZE_PTR
(без учета диапазона 1
- 15
).