Foi publicado o lançamento da linguagem de programação de uso geral Rust 1.58, fundada pelo projeto Mozilla, mas agora desenvolvida sob os auspícios da organização independente sem fins lucrativos Rust Foundation. A linguagem se concentra na segurança da memória, fornece gerenciamento automático de memória e fornece meios para alcançar alto paralelismo de tarefas sem usar um coletor de lixo ou tempo de execução (o tempo de execução é reduzido à inicialização básica e manutenção da biblioteca padrão).
O gerenciamento automático de memória do Rust elimina erros ao manipular ponteiros e protege contra problemas decorrentes da manipulação de memória de baixo nível, como acesso a uma região de memória após ela ter sido liberada, desreferências de ponteiro nulo, saturação de buffer, etc. Para distribuir bibliotecas, garantir a montagem e gerenciar dependências, o projeto está desenvolvendo o gerenciador de pacotes Cargo. O repositório crates.io é compatível com hospedagem de bibliotecas.
Principais inovações:
- Nos blocos de formatação de linha, além da capacidade anteriormente disponível de substituir variáveis explicitamente listadas após uma linha por número e nome, é implementada a capacidade de substituir identificadores arbitrários adicionando a expressão “{identifier}” à linha. Por exemplo: // Construções suportadas anteriormente: println!("Hello, {}!", get_person()); println!("Olá, {0}!", get_person()); println!("Olá, {pessoa}!", pessoa = get_person()); // agora você pode especificar let person = get_person(); println!("Olá, {pessoa}!");
Os identificadores também podem ser especificados diretamente nas opções de formatação. let (largura, precisão) = get_format(); for (nome, pontuação) em get_scores() { println!("{nome}: {pontuação:largura$.precisão$}"); }
A nova substituição funciona em todas as macros que suportam definição de formato de string, com exceção da macro “panic!”. nas versões 2015 e 2018 da linguagem Rust, em que panic!("{ident}") é tratado como uma string regular (no Rust 2021 a substituição funciona).
- O comportamento da estrutura std::process::Command na plataforma Windows foi alterado para que ao executar comandos, por questões de segurança, ela não procure mais por arquivos executáveis no diretório atual. O diretório atual é excluído porque pode ser usado para executar código malicioso se os programas forem executados em diretórios não confiáveis (CVE-2021-3013). A nova lógica de detecção de executável envolve a pesquisa nos diretórios Rust, no diretório do aplicativo, no diretório do sistema Windows e nos diretórios especificados na variável de ambiente PATH.
- A biblioteca padrão expandiu o número de funções marcadas como "#[must_use]" para emitir um aviso se o valor de retorno for ignorado, o que ajuda a identificar erros causados pela suposição de que uma função alterará os valores em vez de retornar um novo valor.
- Uma nova parte da API foi movida para a categoria de estável, incluindo os métodos e implementações de características que foram estabilizadas:
- Metadados::is_symlink
- Caminho::is_symlink
- {inteiro}::saturação_div
- Opção::unwrap_unchecked
- Resultado::unwrap_unchecked
- Resultado::unwrap_err_unchecked
- O atributo "const", que determina a possibilidade de utilizá-lo em qualquer contexto ao invés de constantes, é utilizado em funções:
- Duração::novo
- Duração::checked_add
- Duração::saturating_add
- Duração::checked_sub
- Duração::saturating_sub
- Duração::checked_mul
- Duração::saturating_mul
- Duração::checked_div
- Desreferenciação permitida de ponteiros "*const T" em contextos "const".
- No gerenciador de pacotes Cargo, o campo Rust_version foi adicionado aos metadados do pacote e a opção “--message-format” foi adicionada ao comando “cargo install”.
- O compilador implementa suporte ao mecanismo de proteção CFI (Control Flow Integrity), que adiciona verificações antes de cada chamada indireta para detectar algumas formas de comportamento indefinido que podem potencialmente levar a uma violação da ordem de execução normal (fluxo de controle) como resultado do uso de exploits que alteram ponteiros armazenados na memória em funções.
- O compilador adicionou suporte para as versões 5 e 6 do formato de comparação de cobertura LLVM, usado para avaliar a cobertura de código durante o teste.
- No compilador, os requisitos para a versão mínima do LLVM são elevados para LLVM 12.
- O terceiro nível de suporte para a plataforma x86_64-unknown-none foi implementado. O terceiro nível envolve suporte básico, mas sem testes automatizados, publicação de compilações oficiais ou verificação se o código pode ser compilado.
Além disso, podemos destacar a publicação pela Microsoft do lançamento das bibliotecas Rust for Windows 0.30, que permitem utilizar a linguagem Rust para desenvolver aplicativos para o sistema operacional Windows. O conjunto inclui dois pacotes crate (windows e windows-sys), através dos quais você pode acessar a API Win em programas Rust. O código para suporte à API é gerado dinamicamente a partir de metadados que descrevem a API, o que permite implementar suporte não apenas para chamadas existentes da API Win, mas também para chamadas que aparecerão no futuro. A nova versão adiciona suporte para a plataforma de destino UWP (Plataforma Universal do Windows) e implementa os tipos Handle e Debug.
Fonte: opennet.ru