Skip to content
Back to skills

Lang Rust

ASecurity

Fornece padrões de engenharia de software em Rust baseados na documentação oficial (doc.rust-lang.org), na tradução brasileira 'A Linguagem de Programação Rust' (rust-br.github.io/rust-book-pt-br), em 'The Rust Programming Language 3rd Edition' (Klabnik, Nichols, Krycho) e em 'Programming Rust 2nd Edition' (Blandy, Orendorff, Tindall), cobrindo Ownership, Borrowing, Lifetimes, Structs, Enums e Pattern Matching exaustivo, Módulos e Crates, Coleções (Vec/String/HashMap), tratamento de erros (Re...

  • 10 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 8, 2026
developmentpythonrustgoc++bashsqlcode-reviewgitapidatabase

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned September 8, 2026

npx -y skills add dandgabr/skills --skill lang-rust --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Lang Rust?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Lang Rust
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/dandgabr-lang-rust/badge)](https://www.skillsdirectory.com/skills/dandgabr-lang-rust)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: "lang-rust"
description: "Fornece padrões de engenharia de software em Rust baseados na documentação oficial (doc.rust-lang.org), na tradução brasileira 'A Linguagem de Programação Rust' (rust-br.github.io/rust-book-pt-br), em 'The Rust Programming Language 3rd Edition' (Klabnik, Nichols, Krycho) e em 'Programming Rust 2nd Edition' (Blandy, Orendorff, Tindall), cobrindo Ownership, Borrowing, Lifetimes, Structs, Enums e Pattern Matching exaustivo, Módulos e Crates, Coleções (Vec/String/HashMap), tratamento de erros (Result/Option/thiserror), Genéricos e Traits, Closures e Iterators zero-cost, Smart Pointers (Box/Rc/Arc/RefCell/Mutex), Concorrência (threads, channels, Send/Sync), Async (Tokio), Testes (cargo test), Cargo Workspaces e Profiles, Unsafe Rust/Nomicon e FFI."
---

# Habilidade de IA: Engenharia de Rust (Rust Specialist)

Esta skill orienta a inteligência artificial a atuar como especialista na linguagem **Rust**, seguindo rigorosamente as diretrizes da documentação oficial ([rust-lang.org/pt-BR/learn](https://www.rust-lang.org/pt-BR/learn)) — *O Livro* (A Linguagem de Programação Rust, com [tradução pt-BR](https://rust-br.github.io/rust-book-pt-br/title-page.html)), *Rust by Example*, *Rustlings*, *The Cargo Book*, *The Rustonomicon* e a *Referência* — sempre via `rustup doc` para consulta offline. O objetivo é criar código seguro contra corridas de dados (*data races*), livre de vazamentos de memória (sem Garbage Collector), concorrente e de extrema performance.

> 📖 **Referência canônica**: consulte [references/rust-book-guide.md](references/rust-book-guide.md) para o guia consolidado dos capítulos do Livro (conceitos comuns, ownership/borrowing/slices, structs, enums e match, módulos, coleções, erros, genéricos/traits/lifetimes, testes, closures/iterators, Cargo/workspaces, smart pointers, concorrência, padrões avançados e keywords).
> 📖 **Referência avançada**: consulte [references/programming-rust-advanced-guide.md](references/programming-rust-advanced-guide.md) para temas profundos (layout de memória/size/align, traits e generics avançados, unsafe/raw pointers/unions/unsafe traits, atomics e memory orderings, macros `macro_rules!` com fragment specifiers, Pin/Unpin e internals de Futures, FFI com `repr(C)` e panic safety).

---

## 🧭 Diretrizes Gerais de Desenvolvimento em Rust

Ao atuar nesta skill, aplique rigorosamente os fundamentos de segurança de memória e concorrência destemida (*fearless concurrency*):

### 1. Sistema de Posse (Ownership), Empréstimo (Borrowing) e Lifetimes
- **Posse Única (Ownership)**: Cada valor em Rust tem um único proprietário por vez. Quando o proprietário sai de escopo, o valor é desalocado automaticamente via trait `Drop` (RAII).
- **Movimentação (Move Semantics)**: Atribuições de tipos não-Copy (ex.: `String`) transferem a posse e invalidam a origem ("use of moved value"). Tipos `Copy` (inteiros, floats, bool, char) copiam implicitamente; cópia profunda é explícita com `.clone()`.
- **Regras de Empréstimo (Borrowing)**:
  - Pode-se ter qualquer número de referências imutáveis (`&T`) **OU** exatamente uma referência mutável (`&mut T`) em um determinado escopo, mas nunca ambas simultaneamente.
  - Referências devem ser sempre válidas (prevenção de ponteiros pendentes / *dangling pointers*).
- **Slices (`&str`, `&[T]`)**: Prefira views sem posse em assinaturas de API — `fn first_word(s: &str) -> &str` em vez de `&String`, aproveitando deref coercion.
- **Tempo de Vida (Lifetimes)**:
  - Utilize anotações explícitas de tempo de vida (`'a`) em estruturas e funções apenas quando o compilador não puder elidir as regras de tempo de vida (Lifetime Elision Rules).
  - Em estruturas que guardam referências, garanta que a struct não sobreviva ao dado emprestado (`struct Livro<'a> { titulo: &'a str }`).

### 2. Modelagem de Dados Idiomática (Structs, Enums e Pattern Matching)
- **Structs + `impl`**: campos privados por padrão (expostos com `pub`), métodos com `&self`/`&mut self`/`self` e construtores como associated functions (`::new`). Documente com `///`.
- **Enums com dados**: Modele estados e mensagens como `enum` com payloads (`enum Shape { Circle(f64), Square { side: f64 } }`) — equivalente a discriminated unions.
- **`match` exaustivo**: O compilador exige cobertura total de casos; use guards (`x if x > 5`), bindings `@`, or-patterns `|` e destructuring. Para um caso único, prefira `if let` / `let else`.
- **Preferência por `Option<T>`**: A ausência de valor é sempre explícita — nunca existirá `null`/`NullPointerException`; `.unwrap_or`, `.map`, `.and_then`, `.ok_or(err)` compõem com segurança.
- **Newtypes**: `struct Meters(f64);` para type-safety em unidades e invariáveis de domínio.

### 3. Tratamento Idiomático de Erros (`Result` e `Option`)
- **Sem Exceções em Tempo de Execução**: Rust não utiliza exceções. Erros recuperáveis devem ser representados pelo tipo enum `Result<T, E>` (`Ok`/`Err`) e valores opcionais por `Option<T>`; falhas de invariante de programador usam `panic!`.
- **Operador de Propagação `?`**: Prefira propagar erros usando o operador `?` em vez de chamadas repetitivas de `match` ou `.unwrap()`.
- **Proibição de `.unwrap()` em Produção**: Evite `.unwrap()` e `.expect()` em código de produção, exceto em testes unitários ou invariantes matematicamente comprovadas.
- **Panics como Vetor de DoS**: Prefira métodos não-panicking — `.get(i)` em vez de `v[i]`, `checked_add`/`saturating_add` em vez de operadores aritméticos em inputs não confiáveis.
- **Tratamento Encadeado de Erros**: Utilize crates consolidadas como `thiserror` (para definir erros de bibliotecas) e `anyhow` (para tratamento flexível de erros em aplicações binárias, com `.context()`).

### 4. Abstração Zero-Cost, Traits e Genéricos
- **Polimorfismo Baseado em Traits**: Defina comportamentos compartilhados utilizando `trait` (com default methods). Prefira dispatch estático (*monomorphization*) usando `impl Trait` ou genéricos `<T: Trait>` com bounds em `where`.
- **Dynamic Dispatch (`dyn Trait`)**: Use `Box<dyn Trait>` apenas quando for estritamente necessário alocar tipos heterogêneos em tempo de execução (dynamic dispatch via vtable).
- **Closures e Iterators (Cap. 13)**: Preferir o estilo funcional zero-cost — `iter().filter().map().sum()` compila para loop nativo. Compreender os traits de captura de closure: `Fn` (borrow), `FnMut` (mutable borrow), `FnOnce` (consume); use `move` ao transferir dados para threads/tasks.
- **Derivações Automáticas**: Utilize atributos decoradores como `#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]` em structs e enums sempre que apropriado.

### 5. Organização de Projetos (Módulos, Crates e Cargo)
- **Estrutura**: Package → crates (lib/binário) → módulos (`mod`/`pub`/`use`/`super::`/`crate::`). Idioma padrão: **library crate com a lógica + binary crate fino** (`main.rs` mínimo).
- **Cargo.toml**: declare edition (2015/2018/2021), dependências (com features) e **profiles** (`[profile.release] opt-level = 3`); use `cargo check` para iteração rápida, `cargo test` para todos os níveis de teste (unit, integration em `tests/`, doc-tests).
- **Workspace**: monorepos com múltiplos crates compartilhando `Cargo.lock`/`target` (Cargo Workspaces).
- **Qualidade de Código e Formatação**:
  - **`rustfmt`**: Formatação estrita oficial do código (`cargo fmt`).
  - **`clippy`**: Linter oficial para capturar antipadrões e otimizações (`cargo clippy -- -D warnings`).
- **Segurança de Dependências**: Execute `cargo audit` periodicamente para verificar vulnerabilidades conhecidas em crates de terceiros.

### 6. Concorrência e Programação Assíncrona (`Async/Await`)
- **Segurança Concorrente Estática**: Tipos que podem ser transferidos entre threads com segurança implementam o marker trait `Send`. Tipos que podem ser acessados concorrentemente via referências imutáveis implementam `Sync`.
- **Sincronização Primitiva**: Use `Arc<T>` (Atomic Reference Counting) para compartilhamento de posse entre threads e `Mutex<T>` ou `RwLock<T>` para mutabilidade interior concorrente.
- **Ecossistema Assíncrono (`Future`)**:
  - Utilize o padrão `async/await` com um runtime assíncrono consolidado como **Tokio** ou `async-std`.
  - Evite bloqueios síncronos de I/O em tarefas assíncronas (use `tokio::task::spawn_blocking` quando necessário).

### 7. Unsafe Rust e FFI
- **Encapsulamento Estrito de `unsafe`**: Isole blocos `unsafe` dentro de abstrações e funções públicas totalmente seguras (*safe wrappers*).
- **Invariantes de Segurança**: Documente detalhadamente as precondições e invariantes de segurança (`// SAFETY: ...`) em cada bloco `unsafe`.
- **FFI (Foreign Function Interface)**: Utilize `extern "C"` e C-compatible tipos (`c_char`, `c_int`) para interoperabilidade segura com C/C++.

## 🚀 Rust Moderno (Edition 2024 / TRPL 3ª ed.)

O Livro, em sua 3ª edição (Rust 1.85+), reflete os idiomas da **edition 2024** — declarada com `edition = "2024"` no `Cargo.toml`. Destaques:

- **Async como capítulo canônico**: a 3ª ed. traz um novo Capítulo 17 (Fundamentals of Asynchronous Programming) cobrindo `async`/`await` junto com os traits `Future` e `Stream` — deixou de ser apêndice "avançado".
- **`let else`**: para padrões refutáveis, `let Some(x) = value else { return; };` trata o caso de não-correspondência com um bloco de saída (divergência) em vez de propagar `Option` (TRPL, Cap. 19). Erros de padrões não-exaustivos em `let` sugerem migar para `let else`.
- **Trait objects de `Future`**: `dyn Future<Output = ()>` não é `Unpin` — o compilador indicará `Box::pin` quando for necessário fixar futuros heterogêneos coletados em `Box<dyn Future>` (TRPL, Cap. 17, Pin/Unpin).
- **`Box<dyn Error>` como tipo de erro padrão**: retorno `Result<T, Box<dyn Error>>` em `main` e em testes aceita qualquer tipo de erro via `?` — o padrão idiomático da 3ª ed. para aplicações antes de migrar para `anyhow`.

```rust
use std::error::Error;
use std::fs::File;

fn main() -> Result<(), Box<dyn Error>> {
    let greeting_file = File::open("greeting.txt")?;
    Ok(())
}
```

- **`anyhow` em aplicações**: para binários, `anyhow::Result` + `?` + `.context(...)` fornece relatório de causa raiz com backtrace (Programming Rust, Cap. 7); para bibliotecas, mantenha `thiserror`.
- **Genéricos sobre arrays via const bounds**: `[T; N]` com `N` constante permite APIs genéricas sobre tamanho de array (Programming Rust, Cap. 5 e Cap. 10).
- **Closures async**: o corpo de `async fn` compila para um bloco `async move` que retém os parâmetros por posse — prefira `async move` ao transferir capturas para tasks (TRPL, Cap. 17).
- **Miri para unsafe**: a 3ª ed. introduz o uso de `cargo +nightly miri` como verificador dinâmico de undefined behavior em código `unsafe` (Cap. 20).
- **Compatibilidade garantida**: edições são retrocompatíveis — código de editions anteriores continua compilando com a `edition` correta no `Cargo.toml` (Apêndice E).

---

## 🛠️ Ferramentas e Gerenciamento de Projetos (Cargo & Toolchain)

- **Configuração de Dependências (`Cargo.toml`)**:
  - Defina dependências, recursos opcionais (*features*) e perfis de compilação.
  - Utilize `cargo check` durante o desenvolvimento para compilações rápidas sem geração de código de máquina.
- **Qualidade de Código e Formatação**:
  - **`rustfmt`**: Formatação estrita oficial do código (`cargo fmt`).
  - **`clippy`**: Linter oficial para capturar antipadrões e otimizações (`cargo clippy -- -D warnings`).
- **Segurança de Dependências**: Execute `cargo audit` periodicamente para verificar vulnerabilidades conhecidas em crates de terceiros.

---

## 🧰 Padrões de Código Recomendados

### 1. Manipulação Idiomática de Erros com `Result` e `thiserror`
```rust
use std::fs::File;
use std::io::{self, Read};
use thiserror::Error;

#[derive(Error, Debug)]
pub enum ConfigError {
    #[error("falha de E/S ao ler o arquivo de configuração")]
    Io(#[from] io::Error),
    #[error("formato de configuração inválido: {0}")]
    InvalidFormat(String),
}

pub fn read_config(path: &str) -> Result<String, ConfigError> {
    let mut file = File::open(path)?;
    let mut content = String::new();
    file.read_to_string(&mut content)?;
    
    if content.is_empty() {
        return Err(ConfigError::InvalidFormat("arquivo vazio".into()));
    }
    
    Ok(content)
}
```

### 2. Concorrência Assíncrona com Tokio e Canais
```rust
use tokio::sync::mpsc;
use tokio::task;

#[derive(Debug)]
pub struct WorkItem {
    pub id: u64,
    pub payload: String,
}

pub async fn run_pipeline(items: Vec<WorkItem>) {
    let (tx, mut rx) = mpsc::channel::<String>(32);

    for item in items {
        let tx_clone = tx.clone();
        task::spawn(async move {
            let result = format!("Processado item {}: {}", item.id, item.payload);
            let _ = tx_clone.send(result).await;
        });
    }

    drop(tx); // Fecha o transmissor original para permitir que o receptor termine quando as tasks concluírem

    while let Some(message) = rx.recv().await {
        println!("[+] Recebido: {}", message);
    }
}
```

### 3. Padrão Builder com Validação Estática
```rust
#[derive(Debug)]
pub struct ServerConfig {
    pub host: String,
    pub port: u16,
}

pub struct ServerConfigBuilder {
    host: Option<String>,
    port: Option<u16>,
}

impl ServerConfigBuilder {
    pub fn new() -> Self {
        Self { host: None, port: None }
    }

    pub fn host(mut self, host: impl Into<String>) -> Self {
        self.host = Some(host.into());
        self
    }

    pub fn port(mut self, port: u16) -> Self {
        self.port = Some(port);
        self
    }

    pub fn build(self) -> Result<ServerConfig, &'static str> {
        let host = self.host.ok_or("host é obrigatório")?;
        let port = self.port.unwrap_or(8080);
        Ok(ServerConfig { host, port })
    }
}
```

---

## 🔒 Questões de Segurança e Práticas Seguras

- **Blocos Unsafe e Comportamento Indefinido**: Isole blocos `unsafe` ao estrito necessário (deref de raw pointers, FFI, mutação de estáticos, acesso a fields de union). Certifique-se de que as premissas de segurança de memória exigidas pelo Rust sejam respeitadas, evitando desalinhamentos de dados ou referências nulas. Documente com `// SAFETY: ...`.
- **Ciclos de Referência vazam memória mesmo em Rust**: `Rc<RefCell<T>>` com ciclo destrói as garantias de liberação — use `Weak<T>` (com `upgrade() -> Option<Rc<T>>`) no lado não-dono do ciclo.
- **Mutabilidade Interior**: `RefCell<T>` viola regras de borrowing em **runtime** (panic em `borrow_mut` duplicado) — restrinja a single-thread e a superfícies pequenas; entre threads use `Mutex<T>`/`RwLock<T>` e evite deadlock (lock em ordem fixa, solte o guard cedo).
- **Data Races em Unsafe**: Embora o compilador do Rust garanta a thread-safety do código seguro, o uso incorreto de `Send`/`Sync` e ponteiros crus em blocos `unsafe` pode introduzir condições de corrida complexas.
- **Panics como Vetor de DoS**: Operações aritméticas estritas ou acessos a índices de vetores podem causar `panic!` em runtime se falharem. Use métodos seguros como `.get()` ou `.checked_add()` para evitar interrupções de serviço repentinas.
- **Strings UTF-8**: Nunca indexe `String` por byte (pode cortar caractere multibyte/travar) — itere com `chars()`/`bytes()` ou use slices em fronteiras válidas de caracteres.
- **Overflow aritmético**: em release o overflow faz wrap silencioso — valide entradas antes de operar; para contadores/protocolos use Checked/Saturating APIs.

## 🔗 Integração com Outras Skills

- Para aplicação de análise estática e revisão de segurança em código Rust, consulte [sast-code-review](../../security/appsec/sast-code-review/SKILL.md) e [appsec-owasp-asvs](../../security/appsec/appsec-owasp-asvs/SKILL.md).
- Para integrar acesso a banco de dados com tipos verificados em tempo de compilação em Rust (`sqlx`, `diesel`, `tokio-postgres`, `mongodb`), consulte [dba-database-administrator](../../roles/dba-database-administrator/SKILL.md), [db-postgresql](../../databases/db-postgresql/SKILL.md), [db-sqlite](../../databases/db-sqlite/SKILL.md), [db-mariadb](../../databases/db-mariadb/SKILL.md) e [db-mongodb](../../databases/db-mongodb/SKILL.md).
- Para desenvolvimento de ferramentas ofensivas, agentes de segurança ou parsers de alta performance em Rust, consulte [pentest-scripter-python-bash-go](../../security/appsec/pentest-scripter-python-bash-go/SKILL.md).
- Para modelar a arquitetura e comunicação entre componentes de software usando Rust, consulte [software-architect](../../roles/software-architect/SKILL.md).

Files in this skill

  • SKILL.md16.6 KB
  • references/programming-rust-advanced-guide.md18.6 KB
  • references/rust-book-guide.md14.4 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…