Llamada de función indirecta utiliza dirección impar
Cuando el GCC 4.7.3 (20121207) para ARM Cortex-M3 toma la dirección de una función, no obtiene la dirección exacta de la función. Puedo ver un off-by-one en ese puntero.
// assume at address 0x00001204;
int foo() {
return 42;
}
void bar() {
int(*p)() = &foo; // p = 0x1205;
p(); // executed successfully
foo(); // assembly: "bl 0x00001204;"
}
Aunque el puntero apunta a una dirección impar, la ejecución es exitosa. Yo esperaría una excepción en este punto. ¿Por qué se necesita esa dirección extraña y por qué no duele?
Editar
losSO articulo describe una diferencia entre el modo pulgar y ARM. ¿Por qué ese desplazamiento no es visible cuando la función se llama directamente aunque la CPU está en el mismo modo?¿Debería mantenerse la dirección impar o sería difícil restablecer el bit 0? (lo que no pude ver hasta ahora)