Foi lançada a versão 1.99 da linguagem de programação Rust, originalmente desenvolvida pelo projeto Mozilla, mas agora mantida por meio da organização independente e sem fins lucrativos Rust Foundation. A linguagem foca na segurança do uso da memória e fornece ferramentas para alcançar um alto nível de paralelismo na execução de tarefas, sem a necessidade de um coletor de lixo e runtime (o runtime se resume à inicialização básica e à manutenção da biblioteca padrão).
Os métodos de gerenciamento de memória no Rust visam eliminar erros ao manipular ponteiros e proteger contra problemas que surgem devido ao trabalho de baixo nível com a memória, como o acesso à memória após a liberação, a desreferenciação de ponteiros nulos, estouro de buffer, entre outros. Para a distribuição de bibliotecas, a construção e o gerenciamento de dependências, o projeto tem evoluído com o gerenciador de pacotes Cargo. O repositório crates.io é suportado para o armazenamento de bibliotecas.
A manipulação segura da memória em Rust é garantida em tempo de compilação através da verificação de referências, rastreamento de propriedade de objetos, controle do tempo de vida dos objetos (escopos) e avaliação da correção do acesso à memória durante a execução do código. Rust também oferece mecanismos para proteção contra estouros inteiros, exige a inicialização obrigatória de valores de variáveis antes do uso, trata erros de forma superior na biblioteca padrão, aplica o conceito de referências e variáveis imutáveis (immutable) por padrão e oferece uma forte tipagem estática para minimizar erros lógicos.
Principais novidades:
- Foi introduzida a possibilidade de criar no Rust funções com um número variável de argumentos (variadic), exportadas para chamada a partir de projetos escritos em C (C ABI). Como último elemento da lista de parâmetros em tais funções, pode-se usar a construção '...', que é processada no Rust por meio de um tipo especial VaList, semelhante ao va_list em C. unsafe extern "C" fn sum(mut args: ...) -> i32 { let a = unsafe { args.next_arg::() }; let b = unsafe { args.next_arg::() }; a + b } fn foo() -> i32 { unsafe { sum(0i32, 2i32) } }
- As funções Layout::for_value_raw, mem::size_of_val_raw e mem::align_of_val_raw foram estabilizadas, permitindo a determinação segura do tamanho e do alinhamento com ponteiros brutos (raw pointers), inclusive ao utilizar tipos de tamanho dinâmico, como fatias, sem a necessidade de criar referências aos dados.
- A documentação incluiu a recomendação de evitar a liberação de memória que possui uma referência estática com tempo de vida ilimitado (&'static) por meio da chamada Box::leak (liberação reversa), uma vez que tal ação pode potencialmente causar problemas devido à incompatibilidade com futuras otimizações do compilador e mecanismos de alocação de memória conectados. Em vez de criar uma referência estática para a transferência temporária de propriedade, recomenda-se o uso de ponteiros brutos, por exemplo, através da chamada Box::into_non_null.
- Uma nova leva de APIs foi traduzida para a categoria estável, incluindo estabilizações de métodos e implementações de traits:
- IntoIterator for Box<[T; N]>
- IntoIterator for &Box<[T; N]>
- IntoIterator for &mut Box<[T; N]>
- VecDeque::retain_back
- core::ffi::VaList
- Box::into_non_null
- Box::from_non_null
- Vec::into_parts
- Vec::from_parts
- core::mem::size_of_val_raw
- core::mem::align_of_val_raw
- core::alloc::Layout::for_value_raw
- String::from_utf8_lossy_owned
- string::FromUtf8Error::into_utf8_lossy
- FusedIterator for StepBy<I>
- std::fs::set_times
- std::fs::set_times_nofollow
- Um novo perfil embutido 'debug' foi implementado no gerenciador de pacotes cargo, semelhante ao perfil 'dev' (no futuro, as capacidades para depuração e desenvolvimento planejam ser separadas). Ao compilar no CI, a compilação incremental está desativada por padrão.
- A plataforma alvo riscv64-unknown-linux-musl foi movida para o segundo nível de suporte, o que implica garantia de compilação, mas sem garantias ao passar pelo conjunto de testes.
Adicionalmente, podem ser mencionados os projetos e eventos recentemente anunciados relacionados ao Rust:
- A Microsoft elevou Rust ao status de linguagem de primeiro nível e fornecerá total suporte em todas as etapas de desenvolvimento dentro da empresa. Antes disso, o primeiro nível de suporte interno era oferecido para as linguagens C++, C# e TypeScript. Observa-se que Rust já é utilizado em mais de 100 repositórios da Microsoft. Entre outras coisas, componentes em Rust já são utilizados em produtos como Microsoft 365 e Copilot, e um backend separado rustc_codegen_utc para Rust foi preparado para o compilador MSVC, baseado no compilador rustc.
Como principal objetivo do uso de Rust na Microsoft, destaca-se o fortalecimento da segurança do código, crítico do ponto de vista da segurança. Segundo o diretor técnico da Microsoft Azure, cerca de 70% de todas as vulnerabilidades no Windows são causadas por problemas relacionados à memória, que podem ser evitados com o uso de Rust.
- A Google remove a antiga implementação do mecanismo de comunicação entre processos Binder, escrita em C, do núcleo do Linux, substituindo-a por um novo driver Binder IPC reescrito em Rust. Observa-se que, ao longo dos 15 anos de existência do antigo driver, acumulou-se uma dívida técnica considerável e a complexidade excessiva dificultou a localização de erros, a manutenção e a adição de novas funcionalidades. O driver Binder IPC em Rust é agora reconhecido como o principal e não é mais considerado um projeto experimental.
- Foi lançado o Arti 2.7.0, uma implementação da ferramenta Tor, escrita em Rust. Quando o código do Arti alcançar um nível capaz de substituir completamente a versão em C, os desenvolvedores do Tor pretendem dar ao Arti o status de implementação principal do Tor e gradualmente interromper a manutenção da implementação em C. A nova versão trouxe avanços na funcionalidade para relays e servidores autoridades de diretórios (Directory Authority), relacionadas ao parsing de documentos, suporte à mirrorização de servidores de diretórios e ao processamento de tráfego DNS. Foi adicionada uma implementação de RPC para modificar e verificar configurações. Várias vulnerabilidades foram corrigidas - administradores de serviços onion são aconselhados a atualizar urgentemente seus sistemas.
Fonte: opennet.ru
