Книга: Основы программирования в Linux

Указатель null

Указатель null

Современные системы Linux, в отличие от ОС MS-DOS, но подобно новейшим вариантам ОС Windows, надежно защищены от записи или чтения по адресу, на который ссылается пустой указатель (null), хотя реальное поведение системы зависит от конкретной реализации.

Выполните упражнение 7.5.

Упражнение 7.5. Обращение по указателю null

Давайте выясним, что произойдет, когда мы попытаемся обратиться к памяти по пустому или null-указателю в программе memory5a.c.

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
 char *some_memory = (char*)0;
 printf("A read from null %sn", some_memory);
 sprintf(some_memory, "A write to nulln");
 exit(EXIT_SUCCESS);
}

Будет получен следующий вывод:

$ ./memory5a
A read from null (null)
Segmentation fault

Как это работает

Первая функция printf пытается вывести строку, полученную от указателя null; далее sprintf пытается записать по указателю null. В данном случае Linux (под видом библиотеки GNU С) простила чтение и просто предоставила "магическую" строку, содержащую символы (null). Система не столь терпима в случае записи и просто завершила программу. Такое поведение порой полезно при выявлении программных ошибок.

Если вы повторите попытку, но не будете использовать библиотеку GNU С, вы обнаружите, что безадресное чтение не разрешено. Далее приведена программа memory5b.c:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
 char z = *(const char *)0;
 printf("I read from location zeron");
 exit(EXIT_SUCCESS);
}

Вы получите следующий результат:

$ ./memory5b
Segmentation fault

В этот раз вы пытаетесь прочесть непосредственно из нулевого адреса. Между вами и ядром теперь нет GNU-библиотеки libc, и программа прекращает выполнение. Имейте в виду, что некоторые системы UNIX разрешают читать из нулевого адреса, ОС Linux этого не допускает.

Оглавление книги


Генерация: 0.951. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз