Usar funciones anidadas de GCC con punteros anchos y sin trampolines II
Microsoft no está involucrada en este tema. El compilador GCC ha mejorado su soporte para funciones anidadas.
Las funciones anidadas permiten a los desarrolladores escribir código más organizado y modular. Sin embargo, cuando se toma la dirección de una función anidada, el compilador GCC crea un trampolín en tiempo de ejecución. Este trampolín se coloca en la pila, lo que requiere que la pila sea ejecutable. Esto plantea problemas de seguridad, ya que una pila no ejecutable es una característica de seguridad importante.
“Esto plantea problemas de seguridad, ya que una pila no ejecutable es una característica de seguridad importante”
En la versión 16 de GCC, se garantiza que las funciones anidadas que no acceden a variables de la función principal no requieren un trampolín. Esto significa que se puede devolver de manera segura una función anidada desde su función principal. Además, el compilador emite una advertencia cuando se intenta devolver una función que accede al contexto local.
Las funciones anidadas que no acceden a variables de la función principal aún pueden acceder a variables estáticas, constantes con nombre o tipos. Esto es útil para escribir funciones de devolución de llamada. Sin embargo, el verdadero poder de las funciones anidadas radica en la capacidad de acceder directamente a las variables de la función principal.
En la versión 17 de GCC, se ha implementado una nueva función integrada que permite escribir funciones anidadas con captura sin requerir trampolines. Esto se logra mediante el uso de una función integrada que pasa la dirección de la función anidada y la cadena estática como argumentos. El compilador puede optimizar automáticamente este código para eliminar la necesidad de trampolines.
Con esta mejora, los desarrolladores pueden escribir código más eficiente y seguro utilizando funciones anidadas. Aunque esta característica no es portable entre compiladores, es un paso importante hacia la mejora de la seguridad y el rendimiento del código. En el futuro, se discutirá cómo utilizar funciones anidadas con otros compiladores y cómo evitar la creación de trampolines en versiones anteriores de GCC.