Подтвердить что ты не робот

Гарантированы ли функции C с фиксированным адресом памяти?

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

например.

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

assert(foo_p == &foo);

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

4b9b3361

Ответ 1

В 6.5.9:

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

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

Ответ 2

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

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

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