Os desenvolvedores do projeto LLVM propuseram uma série de alterações voltadas para aumentar a segurança de projetos críticos em C++ e oferecer meios para evitar erros causados por estouro de buffers. O trabalho é concentrado em duas frentes: fornecer um modelo de desenvolvimento que permita trabalhar com buffers de forma segura e realizar melhorias na proteção da biblioteca padrão de funções libc++.
O modelo proposto de programação segura para C++ sugere o uso das classes fornecidas pela biblioteca padrão ao trabalhar com buffers, em vez de manipular ponteiros brutos. Por exemplo, recomenda-se usar as classes std::array, std::vector e std::span, que terão verificação de estouro de memória incorporada, realizada em tempo de execução.
Para combater práticas de programação perigosas, o clang propõe emitir avisos de compilador para todas as operações aritméticas com ponteiros, semelhantes aos avisos do linter clang-tidy, exibidos ao usar a flag "cppcoreguidelines-pro-bounds-pointer-arithmetic", cujo suporte será adicionado no lançamento do LLVM 16. Para ativar esses avisos no clang, uma flag separada, que não estará ativa por padrão, será adicionada.
No libc++, planeja-se implementar um modo opcional de proteção reforçada, que, quando ativado, irá detectar em tempo de execução algumas situações que levam a comportamentos indefinidos. Por exemplo, nas classes std::span e std::vector, será monitorado o acesso além da área de memória alocada, e se ocorrer, o programa será encerrado abruptamente. Os desenvolvedores acreditam que a adição de tais alterações manterá o libc++ em conformidade com os padrões C++, uma vez que a escolha do método de tratamento de casos de comportamento indefinido é deixada aos desenvolvedores da biblioteca, que podem, inclusive, interpretar o comportamento indefinido como uma falha, exigindo a terminação do programa.
As verificações realizadas em tempo de execução no libc++ estão planejadas para serem categorizadas, permitindo sua ativação individual. Algumas das verificações propostas, que não complicam as operações ou alteram o ABI, já estão implementadas no modo seguro do libc++ (safe mode).
Além disso, está planejado desenvolver ferramentas para a correção de código que permitem substituir variáveis com ponteiros nus por containers e aplicar manipuladores alternativos em situações onde o container não pode substituir diretamente o ponteiro (por exemplo, a construção "if(array_pointer)" pode ser transformada em "if(span.data()"). As correções podem ser aplicadas não apenas a variáveis locais, mas também a parâmetros de tipos com ponteiros.
Fonte: opennet.ru
