El proyecto LLVM desarrolla herramientas para un manejo seguro de buffers en C++

Los desarrolladores del proyecto LLVM han propuesto una serie de cambios destinados a mejorar la seguridad de proyectos críticos en C++ y proporcionar mecanismos para prevenir errores causados por desbordamientos de búfer. El trabajo se centra en dos direcciones: ofrecer un modelo de desarrollo que permita trabajar de forma segura con búferes y fortalecer la protección de la biblioteca estándar de funciones libc++.

El modelo propuesto de programación segura para C++ implica utilizar las clases proporcionadas por la biblioteca estándar al trabajar con búferes en lugar de manipular punteros crudos. Por ejemplo, se sugiere utilizar las clases std::array, std::vector y std::span, a las que se les añadirá una verificación de desbordamientos de memoria que se realizará en tiempo de ejecución.

Para combatir prácticas de programación peligrosas, se propone en clang emitir advertencias del compilador para todas las operaciones aritméticas con punteros, similares a las advertencias del linter clang-tidy, que se emiten al usar la bandera «cppcoreguidelines-pro-bounds-pointer-arithmetic», cuyo soporte estará disponible en la versión LLVM 16. Para habilitar tales advertencias en clang, se añadirá una bandera separada, la cual no estará activa por defecto.

En libc++ se planea implementar un modo opcional de mayor protección, en el cual se capturarán en tiempo de ejecución algunas situaciones que llevan a comportamientos indefinidos. Por ejemplo, en las clases std::span y std::vector se rastreará el acceso fuera del área de memoria asignada, y en caso de detectarse, el programa se cerrará de forma abrupta. Los desarrolladores creen que la adición de tales cambios mantendrá a libc++ en conformidad con los estándares de C++, ya que la elección del método para manejar los casos de comportamiento indefinido recae en los desarrolladores de la biblioteca, quienes pueden considerar el comportamiento indefinido como un fallo que requiera la terminación del programa.

Las verificaciones realizadas en tiempo de ejecución en libc++ se prevé que se dividan en categorías, las cuales podrán habilitarse individualmente. Algunas de las verificaciones propuestas, que no complican las operaciones ni alteran la ABI, ya se han implementado en el modo seguro de libc++ (safe mode).

Además, se planea preparar herramientas para la corrección de código que permitirán sustituir variables con punteros desnudos por contenedores y aplicar controladores alternativos en situaciones donde un contenedor no pueda reemplazar directamente un puntero (por ejemplo, la construcción «if(array_pointer)» podría transformarse en «if(span.data()»). Las correcciones pueden aplicarse no solo a variables locales, sino también a parámetros de tipos con punteros.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster