Rust é realmente seguro?
C++ realmente é tão inseguro assim?
Vi uma apresentação no YouTube sobre um tema interessante e resolvi compartilhar.
Se eu fosse traduzir o título, seria algo com a nuance de “dizer para usar uma linguagem com segurança de memória não é uma questão tão simples assim”.
O palestrante expõe suas ideias de uma posição relativamente justa, sem pender para um lado.
- Rust evita a execução de código inseguro para a memória por meio de
panic, mas o "Rust inseguro" pode contornar essas proteções. - No entanto,
unsafe Rustexige opt-in explícito, então fica mais visível do que C/C++ inseguros. Isso permite revisar essas partes com mais foco. - Cerca de 30% dos crates Rust usam código inseguro e, em sistemas embarcados, esse uso é duas vezes maior.
- Sanitizers (ferramentas de análise dinâmica) podem detectar erros de memória tanto em código Rust quanto em C/C++.
- 70% dos desenvolvedores Rust chamam código inseguro por meio de FFI (foreign function interface / interface de função externa) com bibliotecas C/C++.
- Muitas bibliotecas importantes usadas também em projetos Rust são escritas em C/C++ (SQLite, biblioteca OPCUA).
- Os sanitizers podem analisar código Rust e C/C++ na camada LLVM IR quando o código-fonte está disponível.
- Miri é uma ferramenta complementar para detectar comportamento indefinido em Rust na representação intermediária de nível médio.
- Vantagens do Miri: fornece erros claros e verifica todos os comportamentos indefinidos ao mesmo tempo. Limitações: não consegue interpretar código C/C++.
- Aproximadamente 20% das funções da biblioteca padrão do Rust usam código inseguro.
- Infraestruturas críticas precisam não só de código com segurança de memória, mas também de código correto para evitar danos materiais ou riscos à vida.
- Mesmo programas Rust seguros podem falhar ou ser vulneráveis a ataques de negação de serviço.
- Testes baseados em propriedades podem ajudar gerando entradas aleatórias para encontrar casos de borda, mas têm dificuldade com erros impossíveis.
- Kani é um model checker que usa matemática para verificar a correção de programas dentro de determinadas restrições.
- Vantagens do Kani: avalia matematicamente todas as entradas dentro das restrições. Limitações: exige desenrolar loops e não oferece suporte a concorrência nem a FFI com C/C++.
- Conclusão sobre Rust: Rust é seguro, mas não tão seguro quanto se imagina.
- Bjarne Stroustrup distingue C de C++ e menciona que C++ foi projetado para permitir código mais seguro.
- As C++ Core Guidelines oferecem perfis para segurança de tipos, segurança de limites e segurança de tempo de vida, aproximando-se das garantias do Rust.
- O maior problema do C++ é que, por padrão, é fácil demais escrever código inseguro. Não é que os desenvolvedores não estejam se esforçando.
Ainda não há comentários.