Desarrolladores de LLVM proponen un manejo seguro de bĂșfer en C++

LLVM Logo

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.


Añadir como fuente preferida en Google