Una bifurcación indirecta (también conocida como salto calculado , salto indirecto y salto indirecto de registro ) es un tipo de instrucción de control de programa presente en algunos conjuntos de instrucciones de lenguaje de máquina . En lugar de especificar la dirección de la siguiente instrucción a ejecutar , como en una bifurcación directa , el argumento especifica dónde se encuentra la dirección. Un ejemplo es 'salto indirecto en el registro r1 ', lo que significa que la siguiente instrucción a ejecutar está en la dirección del registro r1. La dirección a la que se saltará no se conoce hasta que se ejecuta la instrucción. Las bifurcaciones indirectas también pueden depender del valor de una ubicación de memoria .
Una rama indirecta puede ser útil para hacer una rama condicional , especialmente una rama multidireccional . Por ejemplo, en función de la entrada del programa , se podría buscar un valor en una tabla de saltos de punteros a código para manejar los diversos casos implicados por el valor de los datos. El valor de los datos se podría agregar a la dirección de la tabla, y el resultado se podría almacenar en un registro. Luego se podría hacer un salto indirecto en función del valor de ese registro, enviando de manera eficiente el control del programa al código apropiado para la entrada.
De manera similar, las instrucciones de llamada a subrutinas pueden ser indirectas, con la dirección de la subrutina que se llamará especificada en la memoria. Los punteros de función se implementan normalmente con llamadas a subrutinas indirectas.
Las ramas indirectas fueron una de las superficies de ataque de Spectre . Para mitigar el ataque, GCC 8.1 introdujo las siguientes opciones nuevas: -mindirect-branch=
, -mfunction-return=
y -mindirect-branch-register
. [1] [nb 1]
RETPOLINE=y
característica añadida en el kernel de Linux 4.14.14/4.9.77/4.4.112. Véase también: Retpoline