Foi lançado o Rust 1.98, uma linguagem de programação originada do projeto Mozilla, agora desenvolvida sob a tutela da organização sem fins lucrativos Rust Foundation. A linguagem foca em uma manipulação segura de memória e oferece ferramentas para alcançar alto paralelismo na execução de tarefas, sem depender de um coletor de lixo e runtime (o runtime reduz-se à inicialização básica e ao suporte 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:
- Para os tipos de ponto flutuante f32 e f64, foram implementados métodos algébricos para adição, subtração, multiplicação, divisão e cálculo do resto, que realizam uma otimização semelhante à opção "-ffast-math" em compiladores C/C++. Esses métodos permitem alterar a ordem das operações quando necessário para otimizações, como vetorização de loops. Por exemplo, ao calcular "a + b + c + d" usando a adição comum, o compilador sempre executará a computação em uma ordem "((a + b) + c) + d", enquanto o método algebraic_add pode agrupar a expressão como "(a + b) + (c + d)" e executar "(a + b)" e "(c + d)" em paralelo usando instruções SIMD. O preço da aplicação de métodos algébricos é a indeterminação dos resultados da computação, que podem variar dentro de uma margem de erro.
- Para todos os tipos primitivos inteiros, foi implementado um método embutido "format_into" para converter números em strings, que pode ser usado em vez do pacote itoa. Um buffer NumBuffer<Self> é passado como parâmetro, cujo tamanho é garantido para ser suficiente para gravar qualquer valor do tipo utilizado em formato decimal. O resultado retornado é uma string formatada &str, cuja vida útil está ligada ao buffer.
- A interação entre o wrapper ManuallyDrop e o ponteiro inteligente Box agora não resulta em comportamento indefinido.
- Uma nova leva de APIs foi traduzida para a categoria estável, incluindo estabilizações de métodos e implementações de traits:
- str::substr_range
- [T]::subslice_range
- core::fmt::NumBuffer
- <{integer}>::format_into
- Send/Sync para std::process::CommandArgs
- {fN}::algebraic_add
- {fN}::algebraic_sub
- {fN}::algebraic_mul
- {fN}::algebraic_div
- {fN}::algebraic_rem
- NonZero<{integer}>::from_str_radix
- String::from_utf16le
- String::from_utf16le_lossy
- String::from_utf16be
- String::from_utf16be_lossy
- [T]::strip_circumfix
- str::strip_circumfix
- Atomic<T>::from_mut
- Atomic<T>::get_mut_slice
- Atomic<T>::from_mut_slice
- std::range::legacy
- As plataformas alvo thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf e thumbv8r-none-eabihf foram atualizadas para o segundo nível de suporte, o que implica em garantia de compilação, mas sem garantias durante a execução dos testes.
- Suporte adicionado para as plataformas powerpc64-unknown-linux-gnuelfv2 e aarch64-unknown-linux-pauthtest, que agora têm o terceiro nível de suporte. O terceiro nível cobre suporte básico, mas sem testes automatizados, publicações de compilações oficiais e verificação da capacidade de compilação do código.
Além disso, vale mencionar a comprometimento do popular pacote crate arrayref, que contou com mais de 53 milhões de downloads nos últimos 90 dias e é utilizado como dependência em 403 pacotes. Os atacantes carregaram novos pacotes proc-macro1, proc-macro-en, aovine, arone, aronenao e tinymember no repositório crates.io, que continham código malicioso. Após isso, novas versões dos pacotes arrayref 0.3.10, internment 0.8.7 e append-only-vec 0.1.9 foram publicadas, adicionando o pacote malicioso proc-macro1 como dependência. A versão maliciosa do pacote arrayref foi publicada em 20 de agosto às 10:15 (MSK) e permaneceu disponível até às 11:41, sendo então removida pelos administradores do crates.io.
Não conseguimos entrar em contato com o desenvolvedor do arrayref para esclarecer a situação, mas é suposto que suas credenciais tenham sido comprometidas por agentes maliciosos. No pacote proc-macro1, a alteração maliciosa estava presente no script de construção e fazia o download de um executável externo. servidorO arquivo baixado em sistemas Unix era salvo como /tmp/rust-setup, enquanto no Windows era salvo como %TEMP%\rust-setup.ps1 ou %TEMP%\rust-setup-launch.vbs.
Fonte: opennet.ru
