O proxecto LLVM desenvolve un manexo seguro do búfer en C++

Os desenvolvedores do proxecto LLVM propuxeron unha serie de cambios destinados a reforzar a seguridade dos proxectos C++ de misión crítica e proporcionar un medio para eliminar os erros causados ​​polos excesos de búfers. O traballo céntrase en dúas áreas: proporcionar un modelo de desenvolvemento que permita un traballo seguro con búfers e traballar para reforzar a seguridade da biblioteca estándar de funcións libc++.

O modelo de programación seguro proposto para C++ implica o uso de clases proporcionadas pola biblioteca estándar cando se traballa con búfers en lugar de manipular punteiros simples. Por exemplo, proponse utilizar as clases std::array, std::vector e std::span, que engadirán unha comprobación de tempo de execución para a memoria excesivamente asignada.

Para combater as prácticas de programación perigosas en clang, proponse mostrar advertencias do compilador para todas as operacións aritméticas de punteiro, de forma similar á saída de advertencias de clang-tidy de linter cando se usa a bandeira "cppcoreguidelines-pro-bounds-pointer-arithmetic", cuxa compatibilidade será aparecen na versión LLVM 16. Para activar tales avisos, engadirase unha marca separada a clang, non activa por defecto.

Está previsto implementar un modo de protección mellorada opcional en libc++, que, cando estea activado, detectará algunhas situacións en tempo de execución que provocan un comportamento indefinido. Por exemplo, nas clases std::span e std::vector, supervisarase un acceso á memoria fóra dos límites e, se se detecta, o programa fallará. Os desenvolvedores cren que engadir tales cambios manterá libc++ en conformidade cos estándares de C++, xa que a elección de como tratar casos de comportamento indefinido correspóndelle aos desenvolvedores da biblioteca, que poden, entre outras cousas, tratar o comportamento indefinido como un fallo, requirindo programa para finalizar.

Está previsto que as comprobacións de execución en libc++ se dividan en categorías que se poden activar individualmente. Algunhas das comprobacións propostas, que non levan a complexidade de operacións ou cambios no ABI, xa están implementadas no modo seguro de libc++.

Ademais, prevese preparar ferramentas para axustar o código, que lle permitan substituír variables con punteiros simples por contedores e utilizar controladores alternativos en situacións nas que o contedor non pode substituír directamente o punteiro (por exemplo, a construción "if(array_pointer)" pode converterase en "if(span.data) ()"). Os axustes pódense aplicar non só ás variables locais, senón tamén aos parámetros dos tipos de punteiro.

Fonte: opennet.ru

Engadir un comentario