Rust 1.96.0

Publicada a versão Rust 1.96.0 — da mais recente versão estável da linguagem de programação Rust. A atualização foi lançada 28 de maio de 2026; você pode instalá-la com o comando padrão rustup update stable. As principais mudanças incluem novos tipos de intervalos em core::range, estabilização de macros para verificação de correspondência de padrões, rigidez no comportamento de compilações WebAssembly e correções de duas vulnerabilidades no Cargo.

Principais mudanças

  • Novos tipos de intervalos core::range::Range*.
    Na biblioteca padrão, novas variações de intervalos foram estabilizadas: core::range::Range, RangeFrom, RangeInclusive e iteradores relacionados. Diferente dos tipos antigos de core::ops, os novos intervalos não implementam Iterator diretamente, mas são convertidos em iteradores através de IntoIterator. Isso permite que tais intervalos sejam Copy, o que é conveniente, por exemplo, ao armazenar um intervalo como um campo de estrutura. A sintaxe como 0..1 ainda cria os tipos antigos de intervalos, mas em uma futura versão da linguagem, está planejado que seja convertida para os novos tipos.

  • Adicionados assert_matches! e debug_assert_matches!.
    As novas macros permitem verificar se um valor corresponde a um determinado padrão. Em essência, isso é semelhante a assert!(matches!(…)), mas em caso de erro, a representação de depuração do valor é exibida, facilitando o diagnóstico. As macros não foram adicionadas ao prelude para evitar conflitos com crates populares de terceiros, portanto, precisam ser importadas explicitamente de core ou std.

  • Comportamento das metas WebAssembly foi alterado.
    Rust não transmite mais ao linker —allow-undefined para compilações WebAssembly. Agora, símbolos indefinidos durante a vinculação são considerados um erro, em vez de serem automaticamente convertidos em importações do módulo "env". Isso deve identificar erros de compilação e nomes de símbolos incorretos mais cedo. O comportamento antigo pode ser restaurado, se necessário, através de RUSTFLAGS=-Clink-arg=—allow-undefined ou especificando explicitamente o módulo wasm importado através de #[link(wasm_import_module = "env")].

  • O Cargo recebeu correções de segurança.
    Na versão Rust 1.96.0, duas vulnerabilidades foram corrigidas, afetando usuários de registries de terceiros. CVE-2026-5223 está relacionada ao manuseio de symlink dentro de arquivos tar de crate: um pacote malicioso de um registry de terceiros poderia sobreescrever o cache de outro pacote do mesmo registry. A partir de Rust 1.96.0, o Cargo rejeita arquivos tar de crate com symlink. CVE-2026-5222 está relacionada à normalização de URL de sparse registry e em condições raras poderia resultar no envio de um token do Cargo para um registry malicioso. Usuários do crates.io, de acordo com a equipe do Rust, não foram afetados por esses problemas.

  • Mudanças na linguagem.
    A versão inclui diversas correções pontuais e expansões: agora é permitida a passagem de variáveis meta-expressões expr em cfg, a conversão do tipo never em expressões-tuplas foi ajustada, corrigidos casos raros de sugestões incorretas de tipos de saída para argumentos de funções, suporte adicionado a registradores vetoriais s390x em assembly inline, além de permitir novamente o uso de constantes do tipo ManuallyDrop como templates — isso corrige uma regressão que surgiu no Rust 1.94.0.

  • Mudanças no compilador e nas plataformas.
    Para alvos Linux no LoongArch, suporte à relaxação de links foi incluído — uma otimização de vinculação que simplifica algumas transições e chamadas após a colocação do código. Para riscv64gc-unknown-fuchsia, a configuração básica foi atualizada para o perfil RVA22 com suporte para extensões vetoriais.

  • Atualizações da biblioteca padrão.
    Adicionado suporte à iteração sobre intervalos de números inteiros NonZero. A manipulação de endereços de host em SGX via ToSocketAddr foi corrigida, e na documentação e contratos internos a definição de memória "permitida para leitura/escrita" foi especificada: ponteiro nulo excluído da definição geral, enquanto exceções são especificadas separadamente para métodos específicos.

  • APIs estabilizadas.
    Entre as interfaces estabilizadas estão — assert_matches!, debug_assert_matches!, implementações de From para AssertUnwindSafe, LazyCell e LazyLock, além de novos tipos e iteradores de intervalos de core::range, incluindo Range, RangeFrom, RangeToInclusive e seus iteradores.

  • Cargo: alterações para dependências e documentação.
    Agora, uma dependência pode indicar simultaneamente um repositório Git e um registro alternativo: a versão Git será usada localmente, enquanto na publicação, será usada a versão do registro, semelhante ao comportamento com crates.io. Também foi adicionado suporte para target.’cfg(..)’.rustdocflags na configuração do Cargo.

  • Rustdoc passou a processar a documentação com mais cuidado.
    Notas sobre API deprecated agora são renderizadas como documentação normal, sem o tratamento especial anterior através de white-space: pre-wrap. Além disso, rustdoc não emite mais o lint missing_doc_code_examples para elementos dentro de impl, e na barra lateral da documentação, métodos e funções associadas são separados.

  • Possíveis incompatibilidades.
    A versão traz diversas alterações que podem se manifestar em código não convencional: a disposição de alguns enums #[repr(Int)] foi corrigida em casos extremos, algumas conversões unsize inúteis em Pin foram proibidas, as compilações de WebAssembly agora falham com símbolos indefinidos, o atributo estabilizado por acidente #![reexport_test_harness_main] foi novamente fechado por uma feature gate, o parâmetro -Csoft-float foi removido e a versão mínima do LLVM externo foi elevada para 21. Para AVR, o tipo c_double foi alterado para f32, já que para esses alvos, C double é, por padrão, 32 bits.

Fonte: linux.org.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster