NULL указатели на функции

Каково поведение вызова нулевого указателя на функцию?

void (*pFunc)(void) = NULL;
pFunc();

Почему рекомендуется инициализировать все еще неиспользуемые указатели функций на NULL?

7

Решение

В C и C ++ это называется undefined behaviourЭто означает, что это может привести к Ошибка сегментации, Ничто или что-либо подобное не будет причиной в зависимости от вашего компилятора, операционной системы, в которой вы запускаете этот код, среды (и т. д.).

Инициализация указателя на функцию или вообще указателя на NULL помогает некоторым разработчикам убедиться, что их указатель неинициализирован и не равен случайному значению, тем самым предотвращая разыменование его случайно.

7

Другие решения

  1. Что радует, когда вы пытаетесь получить доступ к NULL?
    Следующее верно как для данных, так и для кода, и это то, что
    происходит, когда вы пытаетесь прочитать NULL (или любой адрес от 0 до
    4096, то есть по крайней мере первая страница сегмента). Основная причина этого заключается в
    ОС и микропроцессорная архитектура сегментации / разбиения на страницы

    Когда вы пытаетесь получить доступ к пустому (или 0) адресу, в любой из данных или кода
    раздел, это вызывает ошибку сегментации (которая на самом деле является убийцей
    ошибка страницы). Первая страница раздела считается недействительной (или недействительной
    часть) виртуальное адресное пространство. Это целенаправленно эта первая страница
    остается недействительным (или не присутствует), так что по крайней мере один адрес этот указатель
    содержимое может быть представлено как недопустимое в программе при исполнении
    время.

    Дескриптор страницы 1-й страницы (который содержит виртуальный адрес 0,
    NULL), имеет первый бит «присутствует» как 0 (означает его недопустимую страницу). Сейчас если
    вы пытаетесь получить доступ к нулевому указателю (адрес 0), который вызывает
    ошибка страницы, поскольку страницы нет, и ОС попытается решить эту проблему
    ошибка страницы. Когда обработчик ошибок страницы видит, что его пытается получить доступ
    1-я страница, которая рассматривается как недействительная часть виртуального адреса
    пространство это убивает процесс. Это все о процессе пользовательского пространства. Если
    вы пытаетесь получить доступ к пустому указателю в системном процессе (код уровня ядра),
    это приведет к сбою вашей ОС, крушению системы.

    Ссылки: http://en.wikipedia.org/wiki/Page_fault#Invalid
    http://en.wikipedia.org/wiki/Memory_protection#Paged_virtual_memory
    http://pdos.csail.mit.edu/6.828/2005/readings/i386/s05_02.htm

    Выше достаточно bt, как я думаю, вы должны прочитать это, а
    http://www.iecc.com/linker/linker04.txt

  2. Почему указатель функции инициализируется значением NULL?
    Хотя, если вы попытаетесь вызвать с помощью NULL, произойдет сбой страницы / сегмента. NULL обозначает его недопустимую функцию. Если оно
    содержит любой адрес мусора, но в действительном виртуальном адресном пространстве
    раздел кода, я думаю, будет вызван любой код по этому адресу, который
    может быть еще больше бедствий (спл в случае систем реального времени).
    Инициализировать funcp = funct_foo_name + 1; Теперь вызовите функцию, используя
    указатель на функцию Указатель на функцию указывает на действительный виртуальный адрес
    пространство раздела кода. Функция bt начнется с неправильного места
    выполнить. что может привести к неправильному выполнению кода или неправильному
    порядок.

2

Рекомендуется по той же причине, что и инициализация «обычных» (данных) указателей на NULL: потому что это потенциально делает некоторые ошибки легче отследить. Мнения о том, полезно это или нет, конечно, различаются 🙂

0