Navegando por Código Inseguro no Desenvolvimento em Rust
Um estudo sobre o uso de código inseguro por desenvolvedores em Rust.
― 9 min ler
Índice
- A Necessidade do Código Inseguro
- Objetivos da Pesquisa
- Motivações dos Desenvolvedores pra Usar Código Inseguro
- Desempenho
- Ergonomia
- Necessidade
- Raciocínio Sobre Segurança
- Invariantes
- Raciocínio Ad-Hoc
- Ferramentas pra Validar Código Inseguro
- Ferramentas de Análise Estática
- Ferramentas de Análise Dinâmica
- O Papel da Comunidade Rust
- Uma Cultura de Segurança
- Feedback Duro
- Conclusão
- Fonte original
- Ligações de referência
Rust é uma linguagem de programação que tá ficando cada vez mais popular, principalmente pra tarefas que precisam de alto Desempenho e segurança de memória. Ela promete oferecer segurança de memória sem precisar de gerenciamento automático de memória, que é uma coisa complicada em outras linguagens de programação. Mas, pra conseguir essa segurança, Rust tem regras bem rigorosas sobre como os dados podem ser acessados e modificados.
Apesar dessas regras, às vezes os desenvolvedores precisam dar uma quebrada nelas pra usar certos padrões de programação. E é aí que entra o "código inseguro". Código inseguro permite que os desenvolvedores façam ações que Rust normalmente protege, como desreferenciar ponteiros crus ou chamar funções de outras linguagens de programação. Entender como e por que os desenvolvedores usam código inseguro é essencial pra melhorar ferramentas e recursos pra comunidade Rust.
Necessidade do Código Inseguro
AOs desenvolvedores costumam se ver em situações onde acham que não tem uma forma segura de realizar uma tarefa. Eles podem sentir que o desempenho do programa tá em jogo, ou podem estar tentando implementar uma funcionalidade que acreditam que não pode ser feita com segurança. Esses cenários levam muitos desenvolvedores a usar código inseguro.
Usar código inseguro pode trazer benefícios de desempenho ou permitir que os desenvolvedores interajam com bibliotecas existentes escritas em outras linguagens. Mas, vem com riscos. Quando os desenvolvedores usam código inseguro, podem acabar introduzindo bugs ou vulnerabilidades nas suas aplicações. Essa tensão constante entre segurança e desempenho é uma parte vital do uso de Rust.
Objetivos da Pesquisa
Pra entender melhor como os desenvolvedores Rust usam código inseguro, foi conduzido um estudo pra explorar suas motivações, métodos e experiências. A pesquisa tinha como objetivo responder várias perguntas:
- Por que os desenvolvedores escolhem usar código inseguro?
- Como os desenvolvedores raciocinam sobre a segurança do seu código quando usam recursos inseguros?
- Quais ferramentas os desenvolvedores usam pra validar o uso de código inseguro?
- Como a comunidade Rust percebe o código inseguro?
Ao coletar informações por meio de entrevistas e pesquisas, o estudo buscou ter uma visão mais clara do papel do código inseguro no desenvolvimento Rust.
Motivações dos Desenvolvedores pra Usar Código Inseguro
A pesquisa identificou três principais razões pelas quais os desenvolvedores recorrem ao código inseguro: desempenho, ergonomia e necessidade.
Desempenho
Uma das razões mais comuns pra usar código inseguro é a crença de que isso pode levar a um desempenho melhor. Muitos desenvolvedores relataram que optaram por alternativas inseguras somente quando acreditavam que isso tornaria sua aplicação mais rápida ou eficiente. Por exemplo, alguns desenvolvedores evitavam verificações em tempo de execução no seu código, achando que podiam confiar na sua compreensão do estado do programa.
Embora alguns desenvolvedores reconhecessem que poderia haver alternativas seguras, eles muitas vezes sentiam que essas alternativas viriam com uma sobrecarga de desempenho significativa. Como resultado, eles escolheram continuar com código inseguro, convencidos de que era a única maneira de atingir suas metas de desempenho.
Ergonomia
Além do desempenho, alguns desenvolvedores acharam usar código inseguro mais fácil ou mais ergonômico em comparação com alternativas seguras. Embora essa fosse uma motivação menos comum, alguns participantes mencionaram que certas APIs seguras eram complicadas ou difíceis de usar, o que os levou a recorrer ao código inseguro.
Por exemplo, os desenvolvedores às vezes usavam código inseguro como uma forma de contornar regras complicadas ou simplificar a implementação de uma função. Isso pode acelerar o processo de desenvolvimento, mas também levanta questões sobre os trade-offs entre a velocidade de desenvolvimento e a segurança do código.
Necessidade
Muitos desenvolvedores relataram que sentiam que não havia uma alternativa clara ao uso de código inseguro. Eles frequentemente encontravam situações onde precisavam interagir com bibliotecas ou APIs existentes que exigiam operações inseguras. Nesses casos, os desenvolvedores sentiam que estavam limitados pelas rigorosas características de segurança do Rust.
Esse sentimento de necessidade era comum entre desenvolvedores que trabalhavam em projetos que precisavam se conectar com código não-Rust ou lidar com operações de sistema de baixo nível. Em tais casos, eles sentiam que usar código inseguro era a única solução viável.
Raciocínio Sobre Segurança
Ao usar código inseguro, os desenvolvedores muitas vezes confiam em vários métodos pra garantir a correção de suas operações. Embora as regras rigorosas do Rust ofereçam alguma orientação, muitos desenvolvedores têm que aplicar sua experiência e intuição pra navegar nas complexidades das operações inseguras.
Invariantes
Os desenvolvedores costumam raciocinar sobre a solidez do seu código através do conceito de invariantes. Uma invariante é uma condição que se espera ser verdadeira em um certo ponto de um programa. Ao garantir que as invariantes se mantenham, os desenvolvedores podem ter uma noção da segurança do seu código.
Em certos contextos de programação, como sistemas embarcados ou desenvolvimento de sistemas operacionais, essas invariantes podem ser ditadas por especificações de hardware. Os desenvolvedores aproveitariam essas garantias pra se sentirem mais confiantes sobre a correção do seu código inseguro.
Raciocínio Ad-Hoc
Apesar de ter uma abordagem estruturada, muitos desenvolvedores também contavam com raciocínio ad-hoc ao pensar sobre segurança. Alguns desenvolvedores tinham ampla experiência com operações inseguras de outras linguagens de programação e aplicavam princípios semelhantes em Rust. Isso muitas vezes resultava em uma mistura de confiar em seus instintos e seguir as melhores práticas estabelecidas.
No entanto, essa dependência da experiência pessoal e da intuição gera incerteza. Enquanto alguns desenvolvedores estavam confiantes em seus processos de tomada de decisão, outros expressavam dúvidas sobre se suas suposições sobre segurança eram válidas.
Ferramentas pra Validar Código Inseguro
Pra ajudar a garantir a segurança do seu código, os desenvolvedores usam uma variedade de ferramentas feitas pra validar código Rust, incluindo ferramentas de análise estática e dinâmica.
Ferramentas de Análise Estática
Ferramentas de análise estática examinam o código sem executá-lo pra detectar possíveis problemas. No ecossistema Rust, ferramentas como Clippy e cargo-audit são usadas pra identificar erros comuns e vulnerabilidades de segurança nas dependências.
Essas ferramentas podem ser fundamentais pra incentivar práticas de codificação seguras. No entanto, os desenvolvedores nem sempre as usam ao máximo, e alguns relataram negligenciar a integração da análise estática nos seus fluxos de trabalho diários.
Ferramentas de Análise Dinâmica
Ferramentas de análise dinâmica, como Miri e Valgrind, ajudam a encontrar problemas durante a execução do programa. Miri é particularmente interessante porque pode identificar comportamentos indefinidos relacionados às regras de segurança do Rust. Embora Miri seja uma ferramenta poderosa, muitos desenvolvedores relataram que não a usavam com a frequência suficiente, principalmente devido às suas limitações, como a falta de suporte pra chamar funções estrangeiras.
Essas ferramentas têm potencial pra melhorar a segurança do código, mas ainda são subutilizadas. Os desenvolvedores frequentemente enfrentam desafios com a integração dessas ferramentas em seus processos de trabalho, e há uma necessidade de mais conscientização sobre seus benefícios.
O Papel da Comunidade Rust
A comunidade Rust coloca uma ênfase forte na segurança, e esse foco molda as percepções e ações dos desenvolvedores ao lidar com código inseguro.
Uma Cultura de Segurança
Os participantes notaram que a comunidade Rust geralmente favorece práticas de programação seguras. Os desenvolvedores frequentemente sentem pressão pra evitar código inseguro por causa dessa cultura. Muitos mencionaram que acreditam que expor APIs inseguras pode afastar outros desenvolvedores de usar suas bibliotecas, já que a segurança se torna uma preocupação primária.
Um número significativo de respondentes da pesquisa priorizou APIs seguras, refletindo um padrão comunitário que favorece fortemente a segurança. No entanto, essa ênfase pode levar a um estigma contra o código inseguro, fazendo com que os desenvolvedores se sintam desconfortáveis ou defensivos sobre suas decisões de usá-lo.
Feedback Duro
Alguns desenvolvedores relataram ter recebido feedback negativo de membros da comunidade quando procuraram conselhos ou compartilharam suas ideias sobre código inseguro. Novatos, em particular, notaram que suas perguntas sobre o uso de código inseguro eram recebidas com respostas excessivamente críticas, o que pode desencorajá-los de fazer perguntas no futuro.
Enquanto o compromisso da comunidade com a segurança é louvável, a forma como o feedback é entregue pode impactar as experiências dos novatos. Um ambiente mais solidário ajudaria a promover crescimento e compreensão em torno do uso de código inseguro.
Conclusão
O estudo destaca as complexidades e desafios que os desenvolvedores Rust enfrentam ao trabalhar com código inseguro. Embora muitos desenvolvedores recorram ao código inseguro por desempenho, ergonomia ou necessidade, ainda existe uma incerteza disseminada sobre a solidez de suas operações.
A pesquisa revela que, embora haja ferramentas disponíveis pra ajudar a validar o código inseguro, o uso delas é inconsistente e frequentemente negligenciado. Além disso, o forte foco da comunidade Rust na segurança influencia as decisões e práticas dos desenvolvedores.
No geral, há uma necessidade de recursos aprimorados, ferramentas melhores e uma cultura comunitária solidária que incentive práticas seguras enquanto aborda os desafios reais que os desenvolvedores enfrentam ao lidar com código inseguro.
Título: A Mixed-Methods Study on the Implications of Unsafe Rust for Interoperation, Encapsulation, and Tooling
Resumo: The Rust programming language restricts aliasing to provide static safety guarantees. However, in certain situations, developers need to bypass these guarantees by using a set of unsafe features. If they are used incorrectly, these features can reintroduce the types of safety issues that Rust was designed to prevent. We seek to understand how current development tools can be improved to better assist developers who find it necessary to interact with unsafe code. To that end, we study how developers reason about foreign function calls, the limitations of the tools that they currently use, their motivations for using unsafe code, and how they reason about encapsulating it. We conducted a mixed-methods investigation consisting of semi-structured interviews with 19 developers, followed by a survey that reached an additional 160 developers. Our participants were motivated to use unsafe code when they perceived that there was no alternative, and most avoided using it. However, limited tooling support for foreign function calls made participants uncertain about their design choices, and certain foreign aliasing and concurrency patterns were difficult to encapsulate. To overcome these challenges, Rust developers need verification tools that can provide guarantees of soundness within multi-language applications.
Autores: Ian McCormack, Tomas Dougan, Sam Estep, Hanan Hibshi, Jonathan Aldrich, Joshua Sunshine
Última atualização: 2024-10-19 00:00:00
Idioma: English
Fonte URL: https://arxiv.org/abs/2404.02230
Fonte PDF: https://arxiv.org/pdf/2404.02230
Licença: https://creativecommons.org/licenses/by/4.0/
Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.
Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.