Um relato no Hacker News descreve uma falha de solidez (soundness) em Rust, na qual os requisitos de tempo de vida de uma struct podem ser contornados por meio da atribuição covariante de campos. O autor compartilha um pequeno programa que usa um tipo invólucro, Q<T>, contendo um Option<T> com uma implementação de Drop. A implementação de Drop move o valor contido para um Mutex<Vec<Box<dyn Any + Send>>> estático, o que deveria ser impossível para um valor emprestado que não vive por 'static.
No exemplo, uma String local é atribuída por referência ao invólucro dentro de um escopo interno, de modo que o empréstimo deveria terminar quando esse escopo se fecha. Como o campo do invólucro é covariante, o compilador aceita a atribuição, e a referência pode então ser armazenada além do tempo de vida da variável local. O programa compila e imprime conteúdos de memória não relacionados, em vez de ser rejeitado.
Ao ser executado sob o AddressSanitizer, o programa falha com um erro stack-use-after-scope, o que confirma que a referência pendente é de fato desreferenciada. Segundo o relato, o problema é reproduzível nas compilações nightly atuais e em versões estáveis desde pelo menos a 1.85.0. A publicação inclui links para exemplos no Compiler Explorer com e sem sanitizadores.
A descoberta aponta para uma brecha de solidez na forma como a variância interage com o armazenamento baseado em Drop, o tipo de problema que os mantenedores de Rust tratam como de alta prioridade, pois código seguro nunca deve produzir comportamento indefinido.
Perguntas frequentes: por que este programa em Rust compila apesar da referência pendente?
A covariância do campo permite que o compilador aceite a atribuição de uma referência de vida mais curta, e a implementação de Drop então armazena essa referência em um contêiner 'static, estendendo seu uso além do tempo de vida da variável local. Trata-se de um bug de solidez; o compilador deveria rejeitar o código.
Fonte: Hacker News · Resumido por HeadlinesBriefing