Гарантируется ли, что функции C имеют фиксированный адрес памяти? - PullRequest
12 голосов
/ 08 сентября 2011

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

Например1003 *

int foo(void){return 0;}
int (*foo_p)(void) = &foo;

assert(foo_p == &foo);

В приведенном выше коде всегда гарантируется ли утверждение?Существуют ли какие-либо обстоятельства, при которых адрес функции может измениться?

Ответы [ 2 ]

17 голосов
/ 08 сентября 2011

В 6.5.9:

Два указателя сравниваются равными тогда и только тогда, когда оба являются нулевыми указателями, оба являются указателями на один и тот же объект (включая указатель на объекти подобъект в его начале) или функция , оба являются указателями на один после последнего элемента того же объекта массива, или один является указателем на один после конца одного объекта массива, а другой являетсяуказатель на начало другого объекта массива, который следует сразу за первым объектом массива в адресном пространстве.

(жирный шрифт добавлен для выделения).

0 голосов
/ 08 сентября 2011

Адрес функции никогда не изменится. Многие программы построены вокруг концепции обратных вызовов, которые не будут работать, если адрес функции может измениться.

Если, гипотетически, местоположение функции изменилось, например, с помощью самоизменяющейся программы, то все вызовы этой функции в любом случае вызовут segfault или очень неопределенное поведение. Edit: Clarification - символы функций похожи на указатели, если вы free память, на которую указывает указатель, не будут обнулять фактическую переменную-указатель, она все равно будет указывать на нее, так же как ваши вызовы функций по-прежнему будут указывать на старое местоположение перемещенная функция.

Самоизменяющиеся программы являются очень большими исключениями, и в наши дни секция кода двоичного кода защищена от записи, что очень и очень сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...