Desenvolvedores LLVM propõem manipulação segura de buffer em C++

Logotipo LLVM

O LLVM é um framework para desenvolvimento de compiladores, além de ajudar a construir novas linguagens de programação e melhorar as linguagens existentes.

Os desenvolvedores do projeto LLVM propuseram uma série de mudanças destinadas a fortalecer a segurança dos projetos C + + missão crítica e fornecer um meio para eliminar erros causados ​​por saturações de buffer.

Como tal, a proposta que eles lançaram se concentra no trabalho em duas áreas em particular: fornecer um modelo de desenvolvimento que permita trabalhar com segurança com buffers e trabalhar para fortalecer a segurança da biblioteca de funções padrão libc++.

Menciona-se que o modelo de programação segura proposto para C++ «é usar as classes fornecidas pela biblioteca padrão ao trabalhar com buffers em vez de manipular ponteiros brutos». Por exemplo, propõe-se usar as classes std::array, std::vector e std::span, que serão adicionadas com uma verificação de tempo de execução para memória alocada fora dos limites.

Nosso objetivo é melhorar a segurança de bases críticas de código C++. Para isso, planejamos trabalhar em duas ideias.

Biblioteca padrão C++ reforçada
Modelo de programação de buffer seguro C++ e ferramentas de adoção
Hardened libc++ destina-se a tornar as interfaces de biblioteca padrão C++ mais seguras em geral.

O modelo de programação de buffer seguro do C++ juntamente com o libc++ reforçado fornecem mitigação de tempo de execução do acesso à memória fora dos limites. As ferramentas de adoção automatizarão a migração de código para esse novo modelo de programação.

Além disso, também menciona que para combater práticas de programação "perigosas" em clang, se propõe emitir avisos do compilador para todas as operações aritméticas de ponteiro, semelhante aos avisos de linter clang-tidy ao usar o sinalizador "cppcoreguidelines-pro-bounds-pointer-arithmetic", cujo suporte aparecerá no LLVM 16. Para habilitar esses avisos, um sinalizador separado será adicionado ao clang, inativo por padrão .

Está planejado implementar um modo de proteção opcional na libc++, que, quando ativado, detectará algumas situações que levam a um comportamento indefinido em tempo de execução. Por exemplo, nas aulas std::span e std::vetor, um acesso fora dos limites será monitorado e, nesse caso, o programa falhará.

Essas verificações de tempo de execução adicionais serão agrupadas em várias categorias que podem ser controladas separadamente. A intenção é que um fornecedor de envio de libc++ em sua plataforma possa decidir quais verificações habilitar na biblioteca de envio (se houver), dependendo do nível de segurança desejado.

Os desenvolvedores acreditam que adicionar tais mudanças manterá a libc++ compatível com os padrões C++, já 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 um bloqueio que exige que o programa saída.

Os as verificações de tempo de execução na libc++ estão planejadas para serem divididas em categorias que podem ser incluídos individualmente. Algumas das verificações sugeridas que não resultam em operações mais complexas ou alterações de ABI já estão implementadas no modo de segurança da libc++ (modo de segurança).

Para reiterar, o objetivo final é que a biblioteca enviada habilite essas verificações em produção; este não é um recurso "somente depuração", embora eventualmente substitua o "modo de depuração" há muito quebrado.

Além disso, está previsto preparar um conjunto de ferramentas de correção de código que permitirá que variáveis ​​sejam substituídas por ponteiros brutos em contêineres e aplicar manipuladores de fallback 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 convertida em "if(span.data ( )»). As configurações podem ser aplicadas não apenas a variáveis ​​locais, mas também a parâmetros de tipo com ponteiros.

Também é mencionado que estão considerando um "verificador de analisador estático clang" sensível à rota que avisa se std :: span é construído a partir de um contêiner menor que o tamanho especificado no construtor do intervalo. O referido verificador é independente e útil por si só, se tudo correr bem, será ativado por padrão para todos os usuários

Finalmente se você estiver interessado em saber mais sobre isso, você pode verificar os detalhes no link a seguir


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: AB Internet Networks 2008 SL
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.