Una Indirect Function Table (IFT), también conocida como tabla de punteros a funciones o tabla de despacho, es una estructura de datos que almacena una colección de punteros a funciones. En lugar de llamar directamente a una función por su dirección de memoria estática, se utiliza un índice o identificador para buscar la dirección de la función deseada dentro de la tabla. Esto permite que el código invoque funciones de manera indirecta, facilitando mecanismos como el polimorfismo, el despacho dinámico y la implementación de interfaces o APIs donde la función exacta a ejecutar se determina en tiempo de ejecución o se puede cambiar sin recompilar el código cliente.
Las IFTs son fundamentales en muchos sistemas operativos y entornos de ejecución. Por ejemplo, en el kernel de Linux, las tablas de llamadas del sistema (syscall tables) son un tipo de IFT que mapea números de syscall a las funciones del kernel correspondientes. Los sistemas de objetos COM (Component Object Model) de Microsoft utilizan IFTs (conocidas como 'v-tables' o tablas de funciones virtuales) para implementar el polimorfismo y el despacho de métodos en interfaces. Los compiladores y runtimes de lenguajes orientados a objetos como C++ también generan v-tables para manejar el despacho de métodos virtuales. Además, las IFTs son cruciales en la implementación de mecanismos de seguridad como Control-Flow Integrity (CFI), donde se utilizan para validar que las llamadas indirectas a funciones se dirijan únicamente a destinos válidos predefinidos.
Para un arquitecto de sistemas, comprender las IFTs es vital por varias razones. Permiten diseñar sistemas con alta extensibilidad y flexibilidad, donde los componentes pueden ser actualizados o reemplazados sin afectar a los consumidores de sus interfaces. Sin embargo, introducen una ligera sobrecarga de rendimiento debido a la indirección y la búsqueda en la tabla, un trade-off que debe evaluarse frente a la flexibilidad ganada. Desde una perspectiva de seguridad, las IFTs son un objetivo común para ataques de 'control-flow hijacking', por lo que su protección (por ejemplo, mediante CFI) es una consideración crítica en el diseño de sistemas robustos. Un arquitecto debe sopesar la complejidad de la gestión de estas tablas frente a los beneficios de abstracción y mantenimiento, especialmente en sistemas distribuidos o de alto rendimiento donde cada nanosegundo cuenta.