LLVM es una marco para el desarrollo de compiladores ademas de que ayuda a construir nuevos lenguajes de programaciĂłn y mejorar los lenguajes existentes
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.