O projeto LLVM está desenvolvendo ferramentas para trabalhar com buffers de forma segura em C++

Os desenvolvedores do projeto LLVM propuseram uma série de mudanças destinadas a fortalecer a segurança de projetos C++ de missão crítica e fornecer um meio para eliminar erros causados ​​por saturação de buffers. O trabalho está focado em duas áreas: fornecer um modelo de desenvolvimento que permita um trabalho seguro com buffers e trabalhar para fortalecer a segurança da biblioteca de funções padrão libc++.

O modelo de programação seguro proposto para C++ envolve o uso de classes fornecidas pela biblioteca padrão ao trabalhar com buffers em vez de manipular ponteiros simples. Por exemplo, propõe-se usar as classes std::array, std::vector e std::span, que adicionarão uma verificação em tempo de execução para memória superalocada.

Para combater práticas perigosas de programação em clang, propõe-se exibir avisos do compilador para todas as operações aritméticas de ponteiro, semelhante à saída de avisos de linter clang-tidy ao usar o sinalizador “cppcoreguidelines-pro-bounds-pointer-arithmetic”, cujo suporte será aparecem na versão LLVM 16. Para habilitar tais avisos, um sinalizador separado será adicionado ao clang, não ativo por padrão.

Está planejado implementar um modo de proteção aprimorada opcional na libc++, que, quando habilitado, irá capturar algumas situações em tempo de execução que levam a um comportamento indefinido. Por exemplo, nas classes std::span e std::vector, um acesso à memória fora dos limites será monitorado e, se detectado, o programa irá travar. Os desenvolvedores acreditam que adicionar tais mudanças manterá a libc++ em conformidade com os padrões C++, uma vez que a escolha de como lidar com casos de comportamento indefinido cabe aos desenvolvedores da biblioteca, que podem, entre outras coisas, tratar o comportamento indefinido como uma falha, exigindo o programa para terminar.

As verificações de tempo de execução na libc++ estão planejadas para serem divididas em categorias que podem ser habilitadas individualmente. Algumas das verificações propostas, que não levam à complexidade das operações ou alterações na ABI, já estão implementadas no modo de segurança da libc++.

Além disso, está planejado preparar ferramentas para ajustar o código, permitindo substituir variáveis ​​​​com ponteiros vazios por contêineres e usar manipuladores alternativos em situações em que o contêiner não pode substituir diretamente o ponteiro (por exemplo, a construção “if(array_pointer)” pode ser convertido para “if(span.data) ()"). Os ajustes podem ser aplicados não apenas a variáveis ​​locais, mas também a parâmetros de tipos de ponteiro.

Fonte: opennet.ru

Adicionar um comentário