2011-09-08 9 views
12

Si almaceno un puntero a una función, y luego en un punto posterior durante la ejecución de mi programa, compárelo con la dirección de la misma función, se garantiza que las dos direcciones sean iguales.¿Se garantiza que las funciones C tienen una dirección de memoria fija?

E.g.

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

assert(foo_p == &foo); 

En el código anterior, la afirmación siempre está garantizada para tener éxito? ¿Hay circunstancias bajo las cuales la dirección de una función puede cambiar?

Respuesta

17

Per 6.5.9:

Dos punteros comparar iguales si y sólo si ambos son punteros nulos, ambos son punteros a la misma objeto (incluyendo un puntero a un objeto y un subobjeto en su comienzo) o función, ambos son punteros a uno pasado el último elemento del mismo objeto de matriz, o uno es un puntero a uno pasado el final de un objeto de matriz y el otro es un puntero al inicio de un objeto de matriz diferente que sucede seguir inmediatamente el primer objeto de matriz en el espacio de direcciones.

(negrita añadido para dar énfasis.)

0

dirección de una función nunca va a cambiar. Muchos programas se basan en el concepto de devoluciones de llamadas, que no funcionaría si la dirección de una función pudiera cambiar.

Si, hipotéticamente, la ubicación de una función cambia, por ejemplo, mediante un programa de auto modificación, todas las llamadas a esa función causarán un comportamiento de segfault o muy indefinido de cualquier forma. Editar: Aclaración: los símbolos de función son como punteros, si la memoria free apuntada por un puntero, que no pondrá a cero la variable de puntero real, seguirá apuntando allí, del mismo modo que las llamadas de función seguirán apuntando a la ubicación anterior de la movida función.

Sin embargo, los programas de auto-modificación son excepciones muy grandes, y en estos días la sección de códigos de un binario está protegida contra escritura, lo que hace que esto sea muy, muy difícil.

Cuestiones relacionadas