Rust 1.99 estabiliza funções variádicas C e APIs de layout para ponteiros brutos

Rust 1.99.0 estabiliza a definição de funções variádicas com as ABIs C e C-unwind, além de introduzir três APIs estáveis para consultar tamanho, alinhamento e layout por meio de ponteiros brutos. A mudança amplia o que pode ser implementado diretamente em Rust na integração com código C.
Segundo o anúncio oficial do Rust 1.99.0, a linguagem já conseguia chamar funções variádicas externas, como libc::printf. A partir desta versão, também passa a ser possível escrever essas funções em Rust.
Funções variádicas com ABI C
Uma função variádica aceita uma quantidade arbitrária de argumentos por meio de .... No Rust 1.99.0, esse tipo é representado por VaList, compatível em ABI com o tipo va_list da linguagem C nos diferentes targets.
Os argumentos são lidos com operações como next_arg::<i32>(). Os tipos que podem ser extraídos de uma VaList são controlados pelo trait VaArgSafe, que delimita quais valores podem atravessar esse mecanismo.
A responsabilidade de respeitar o contrato da função continua com o chamador. No exemplo divulgado pela equipe, a função exige pelo menos dois argumentos do tipo i32 e usa blocos unsafe para recuperá-los. Isso é necessário porque a lista variável, por si só, não garante em tempo de compilação a quantidade e os tipos efetivamente enviados.
Na prática, a estabilização interessa principalmente a bibliotecas que precisam expor interfaces compatíveis com C. Antes, Rust podia consumir uma função variádica externa; agora também pode implementar esse lado da interface.
A versão ainda estabiliza a definição de funções variádicas naked com ABIs diferentes de C. Nesse caso, porém, a implementação precisa ser escrita com assembly inline.
Layout a partir de ponteiros brutos
A segunda frente da versão trata dos requisitos de segurança para recuperar informações de tamanho e alinhamento a partir de ponteiros brutos. O suporte cobre tipos Sized, cujo caso já era possível no canal estável, e tipos não Sized.
Três funções foram estabilizadas:
core::mem::size_of_val_rawcore::mem::align_of_val_rawcore::alloc::Layout::for_value_raw
Essas APIs permitem obter, respectivamente, o tamanho, o alinhamento e o layout associados ao valor apontado. Para código de baixo nível, isso oferece uma interface estável para trabalhar com essas informações sem depender apenas de alternativas ainda não estabilizadas.
O ponto relevante para revisão de segurança é que a versão estabelece os requisitos aplicáveis a essas consultas. O uso de ponteiros brutos não elimina a necessidade de o código respeitar as condições exigidas pelas APIs.
Biblioteca padrão e Box
O Rust 1.99.0 não altera a semântica da linguagem em relação a Box::leak, mas atualiza sua documentação para desaconselhar padrões que vazam uma alocação e depois tentam desalocá-la.
De acordo com a publicação do Rust Blog, esse padrão apresentou interações problemáticas com otimizações atuais e potenciais do compilador. A situação também é especialmente relevante diante da futura estabilização de alocadores customizados.
Para casos em que o objetivo é recuperar um ponteiro e posteriormente administrar a alocação, a recomendação passa a ser preferir Box::into_non_null ou Box::into_raw. A mesma orientação vale para outras funções de leak da biblioteca padrão.
Entre as demais estabilizações listadas estão implementações de IntoIterator para Box<[T; N]> e suas referências, String::from_utf8_lossy_owned, string::FromUtf8Error::into_utf8_lossy, FusedIterator para StepBy<I> e std::fs::set_times_nofollow.
Ressalvas e limitações
Funções variádicas permanecem uma área de baixo nível: o compilador não valida integralmente o contrato entre a quantidade e os tipos dos argumentos enviados e aqueles lidos pela função. A presença de VaArgSafe restringe os tipos aceitos, mas não substitui as garantias que o chamador precisa fornecer.
As APIs de layout também operam sobre ponteiros brutos e devem ser avaliadas dentro dos requisitos de segurança documentados. Já a mudança sobre Box::leak é uma recomendação de uso, não uma alteração de comportamento da linguagem.
Quando a atualização faz sentido
Rust 1.99.0 é especialmente relevante para projetos com interoperabilidade C, bibliotecas que expõem funções variádicas ou componentes que calculam layout de memória a partir de ponteiros brutos. Também justifica revisar código que use Box::leak com intenção de desalocação posterior.
Para aplicações que não trabalham com FFI, ponteiros brutos ou gerenciamento manual de alocações, as mudanças centrais têm impacto mais restrito. Ainda assim, as novas APIs de strings, iteração e sistema de arquivos podem reduzir a necessidade de implementações auxiliares específicas.
Leia também
- Desenvolvimento
Perplexity troca DynamoDB por CobbleDB em Rust e reduz latência em 5x
4 min de leitura - Desenvolvimento
Cloudflare reduz 100 TB de memória no cache DNS 1.1.1.1 com novo layout em Rust
3 min de leitura - Desenvolvimento
Bun reescreve 535 mil linhas de Zig em Rust em quatro meses e elimina vazamentos
3 min de leitura
Fontes

Fundador da DEVDINIZ
Software em produção
51 ferramentas gratuitas, direto no navegador
Utilitários para CPF, CNPJ, JWT, JSON, regex, cores e mais. Processamento local, sem cadastro e sem conta — a mesma engenharia que sustenta o que escrevemos aqui.