Desarrolladores de LLVM proponen un manejo seguro de búfer en C++
Los desarrolladores del proyecto LLVM propusieron una serie de cambios destinados a fortalecer la seguridad de los proyectos C++ de misión crítica y proporcionar un medio para eliminar los errores causados por las saturaciones de búfer.
Como tal la propuesta que dieron a conocer se centra en el trabajo de dos áreas en especial: proporcionar un modelo de desarrollo que permita trabajar de forma segura con búferes y trabajar para reforzar la seguridad de la biblioteca de funciones estándar libc++.
Se menciona que el modelo de programación seguro propuesto para C++ «es utilizar las clases proporcionadas por la biblioteca estándar cuando se trabaja con búferes en lugar de manipular punteros sin procesar». Por ejemplo, se propone utilizar las clases std::array, std::vector y std::span, que se agregarán con una verificación en tiempo de ejecución para la memoria asignada fuera de los límites.
Nuestro objetivo es mejorar la seguridad de las bases de código críticas de C++. Para ello tenemos previsto trabajar en dos ideas.
Biblioteca estándar reforzada de C++
Modelo de programación de búferes seguros de C++ y herramientas de adopción
La libc++ endurecida tiene como objetivo hacer que las interfaces de la biblioteca estándar de C++ sean más seguras en general.El modelo de programación de búferes seguros de C++ junto con libc++ fortalecida brindan mitigación en tiempo de ejecución del acceso a la memoria fuera de los límites. Las herramientas de adopción automatizarán la migración de código a este nuevo modelo de programación.
Ademas de ello, tambien menciona que para combatir las prácticas de programación «peligrosas» en clang, se propone emitir advertencias del compilador para todas las operaciones aritméticas de punteros, similares a las advertencias de linter de clang-tidy cuando se usa el indicador «cppcoreguidelines-pro-bounds-pointer-arithmetic», cuyo soporte aparecerá en la versión LLVM 16. Para habilitar tales advertencias, se agregará una bandera separada a clang, inactiva por defecto.
Está previsto implementar un modo de protección opcional en libc++, que, cuando está habilitado, detectará algunas situaciones que conducen a un comportamiento indefinido en tiempo de ejecución. Por ejemplo, en las clases std::span y std::vector, se monitoreará un acceso fuera de los límites, en cuyo caso el programa fallará.
Estas comprobaciones de tiempo de ejecución adicionales se agruparán en varias categorías que se pueden controlar por separado. La intención es que un proveedor que envíe libc++ en su plataforma pueda decidir elegir qué comprobaciones habilitar en la biblioteca que envía (si es que las envía), según el nivel de seguridad deseado.
Los desarrolladores creen que agregar dichos cambios mantendrá a libc++ en conformidad con los estándares de C++, ya que la elección de cómo manejar los casos de comportamiento indefinido recae en los desarrolladores de la biblioteca, que pueden, entre otras cosas, tratar el comportamiento indefinido como un bloqueo que requiere la programa para salir.
Las comprobaciones de tiempo de ejecución en libc++ están planificadas para dividirse en categorías que se pueden incluir individualmente. Algunas de las comprobaciones sugeridas que no resultan en operaciones más complejas o cambios de ABI ya están implementadas en el modo seguro de libc++ (modo seguro).
Para reiterar, el objetivo final es que la biblioteca enviada habilite estas comprobaciones en producción; esta no es una característica de «solo depuración», aunque eventualmente reemplazará el «modo de depuración» roto hace mucho tiempo.
Además, está previsto preparar un conjunto de herramientas de corrección de código que permitirán reemplazar variables con punteros sin procesar en contenedores y aplicar controladores alternativos en situaciones en las que el contenedor no puede reemplazar directamente el puntero (por ejemplo, la construcción «if(array_pointer)» puede ser convertido a «if(span.data ()»). Los ajustes se pueden aplicar no solo a las variables locales, sino también a los parámetros de tipo con punteros.
Tambien se hace mención de que están considerando un «comprobador de analizador estático de clang» sensible a la ruta que advierte si std::span se construye a partir de un contenedor que tiene un tamaño más pequeño que el especificado en el constructor del intervalo. Dicho verificador es autónomo y útil por sí solo, si todo va bien, estará habilitado de forma predeterminada para todos los usuarios
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.