El proyecto LLVM desarrolla 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. El trabajo se centra en dos áreas: proporcionar un modelo de desarrollo que le permita trabajar de forma segura con búferes y trabajar para reforzar la seguridad de la biblioteca de funciones estándar libc++.

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 desnudos. 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.

Para combatir 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á un indicador separado a clang, que no está activo de forma predeterminada.

Está previsto implementar un modo de protección endurecido 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á. 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, interpretar 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++.

Además, está previsto preparar un conjunto de herramientas para corregir el código, lo que le permitirá reemplazar variables con punteros desnudos en contenedores y aplicar controladores alternativos en situaciones en las que el contenedor no puede reemplazar directamente el puntero (por ejemplo, el "if (array_pointer)" La construcción se puede convertir 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.

Fuente: opennet.ru

Añadir un comentario