Проблема проверки, является ли указатель NULL или "нулевым размером" в Linux ядре - PullRequest
1 голос
/ 20 марта 2020

В 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 ).

...