Narzędzia do analizy kodu statycznego Rust Developer

Skrzynka z narzędziami programisty Rust: najlepsze narzędzia do analizy kodu statycznego

Kompilator Rusta to najbardziej opiniotwórczy recenzent kodu, z jakim większość programistów kiedykolwiek będzie miała do czynienia. Jego system własności, moduł sprawdzający pożyczanie i egzekwowanie okresu istnienia kodu eliminują całe kategorie błędów, które nękają bazy kodu C i C++. Jednak kompilator, który zapobiega błędom pamięci, to nie to samo, co kompleksowy system jakości. Błędy logiczne, niebezpieczne łańcuchy zależności, niebezpieczne niewłaściwe użycie bloków, antywzorce wydajnościowe i dryf stylu – wszystkie te błędy przetrwają. rustcZespoły, które dostarczają niezawodny język Rust na dużą skalę, łączą kompilator z wielowarstwowym zestawem narzędzi do analizy statycznej, z których każde obejmuje inny obszar jakości.

Wybór niewłaściwej kombinacji marnuje czas CI i generuje szum, który programiści uczą się ignorować. Wybór właściwej kombinacji sprawia, że ​​rygorystyczność kompilatora wydaje się być raczej dolną, a nie górną granicą. Narzędzia w tym przewodniku są uporządkowane według ich faktycznego zastosowania, a nie alfabetycznie, dzięki czemu zespoły mogą zbudować stos obejmujący wszystkie trzy warstwy jakości: linting i idiomy, bezpieczeństwo zależności oraz głęboką weryfikację kodu krytycznego lub wrażliwego pod kątem bezpieczeństwa.

SMART TS XL

Utrzymanie jakości w nowoczesnym programowaniu w języku Rust jest trudne, nawet przy zachowaniu silnych gwarancji bezpieczeństwa tego języka. SMART TS XL został zaprojektowany, aby pomóc zespołom w tworzeniu niezawodnego, łatwego w utrzymaniu i bezpiecznego oprogramowania, oferując dogłębne możliwości analizy statycznej dostosowane do unikalnych funkcji Rust. Wspiera profesjonalne procesy inżynierskie, wykrywając problemy na wczesnym etapie, zapewniając spójność i redukując nakład pracy związany z ręcznym przeglądem.

Trzy warstwy statycznej analizy rdzy

Zrozumienie, które narzędzie należy do którego miejsca należy, zapobiega częstemu błędowi polegającemu na użyciu formalnego weryfikatora tam, gdzie wystarczy linter, lub poleganiu na linterze tam, gdzie wymagany jest skaner bezpieczeństwa. Każdy dojrzały projekt Rust powinien obejmować wszystkie trzy warstwy.

Warstwa 1: Mechacenie i stylizacja Wykrywa idiomatyczne naruszenia, typowe błędy i problemy z konserwacją. Narzędzia: Clippy, rustfmt, rust-analyzer.

Warstwa 2: Zależność i bezpieczeństwo łańcucha dostaw Audytuje skrzynki firm trzecich pod kątem znanych luk w zabezpieczeniach i naruszeń zasad. Narzędzia: cargo-audit, cargo-deny, cargo-auditable.

Warstwa 3: Głęboka weryfikacja Wykrywa problemy z bezpieczeństwem pamięci w niebezpiecznym kodzie, niezdefiniowanym zachowaniu i formalnie dowodzi właściwości funkcji krytycznych. Narzędzia: Miri, Kani, MIRAI, Rudra, Creusot, Prusti.

Poniższa tabela mapuje każde główne narzędzie pod kątem jego warstwy, kosztu, przydatności CI i podstawowego przypadku użycia:

NarzędzieWarstwaKoszty:CI OdpowiedniePodstawowy przypadek zastosowania
ClippypodszewkaBezpłatny / OSSTakIdiomatyczne mówienie, styl, typowe błędy
rdzapodszewkaBezpłatny / OSSTakWymuszanie formatowania kodu
analizator rdzyLinting / DXBezpłatny / OSSCzęściowaDiagnostyka IDE, analiza inline
audyt ładunkuBezpieczeństwo zależnościBezpłatny / OSSTakZnane CVE w skrzyniach
odmowa ładunkuBezpieczeństwo zależnościBezpłatny / OSSTakLicencja, duplikaty, ostrzeżenia
ładunek podlegający audytowiBezpieczeństwo zależnościBezpłatny / OSSTakOsadź dane zależności w plikach binarnych
MiriGłęboka weryfikacjaBezpłatny / OSSSelektywnyNiezdefiniowane zachowanie w niebezpiecznym kodzie
KaniGłęboka weryfikacjaBezpłatny / OSSSelektywnyWeryfikacja formalna, sprawdzanie modeli
MIRAIGłęboka weryfikacjaBezpłatny / OSSSelektywnyInterpretacja abstrakcyjna, analiza skażeń
RudraGłęboka weryfikacjaBezpłatny / OSSBadaniaBłędy bezpieczeństwa pamięci w niebezpiecznym środowisku Rust
SemgrepPrzekrojowePoziom darmowy + płatnyTakNiestandardowe wzorce zabezpieczeń, wielojęzyczne
SonarChmuraPrzekrojowePoziom darmowy + płatnyTakBramka ciągłej jakości, panele kontrolne

Warstwa 1: Linting, styl i doświadczenie programisty

Clippy

Clippy to definitywny punkt wyjścia do analizy statycznej Rusta. Dostarczany z oficjalnym zestawem narzędzi Rusta, oferuje ponad 700 lintów obejmujących poprawność, wydajność, styl, złożoność i ograniczenia. To narzędzie, z którego większość zespołów Rusta korzysta na co dzień, i nie bez powodu: wychwytuje prawdziwe błędy, a nie tylko opinie na temat stylu.

bash

# Run all lints including pedantic and nursery groups
cargo clippy -- -W clippy::all -W clippy::pedantic

# Fail CI on any warning
cargo clippy -- -D warnings

# Check specific lint group
cargo clippy -- -W clippy::correctness -W clippy::suspicious

Warto dokładnie zrozumieć kategorie kłaczków Clippy'ego:

Kategoria Co łapie
correctnessKod, który jest prawie na pewno błędny (zawsze odrzucaj)
suspiciousKod, który prawdopodobnie jest błędny lub bardzo zaskakujący
styleWzory nieidiomatyczne z wyraźną poprawą
complexityNiepotrzebnie złożone konstrukcje
performanceKod, który się kompiluje, ale działa wolniej niż powinien
pedanticŚcisłe wytyczne, oparte na opiniach (włącz selektywnie)
restrictionZasady, które możesz chcieć egzekwować w określonych kontekstach
nurseryNowe kłaczki mogą dawać fałszywie pozytywne wyniki

kontrola ładunku kontra klips: cargo check Sprawdza poprawność typu i kompilację bez generowania pliku binarnego. Jest szybki i odpowiedni do weryfikacji kompilacji. cargo clippy działa cargo check plus cała analiza kłaczków. W przypadku CI uruchom cargo check do szybkiego sprzężenia zwrotnego kompilacji i cargo clippy -- -D warnings jako osobna bramka jakościowa. Nie są one zamienne: cargo check nie wychwyci problemów idiomatycznych i cargo clippy jest wolniejszy.

Konfigurowanie Clippy przez clippy.toml lub atrybuty wbudowane dają zespołom kontrolę nad szumem:

toml

# clippy.toml
avoid-breaking-exported-api = false
msrv = "1.70"

spokój

// Suppress a lint for one function with documented reason
#[allow(clippy::too_many_arguments)]
fn complex_setup(...) { ... }

Czego Clippy nie obejmuje: dogłębnej analizy przepływu danych między modułami, skanowania luk w zabezpieczeniach w zależnościach, formalnego dowodu poprawności ani niestandardowych reguł specyficznych dla organizacji. Wymaga to narzędzi w pozostałych warstwach.

rdza

rustfmt wymusza spójne formatowanie w całej bazie kodu za pomocą cargo fmt, rustfmt.toml Plik konfiguracyjny ustala reguły stylu dla całego projektu. W CI, cargo fmt -- --check kończy się z kodem różnym od zera, jeśli jakikolwiek plik miałby zostać sformatowany, dzięki czemu jest to bramka o czystej jakości i bez obciążenia konfiguracyjnego:

bash

# Check formatting without modifying files (CI mode)
cargo fmt -- --check

# Apply formatting (developer mode)
cargo fmt

Rust-Analyzer i integracja IDE

rust-analyzer to implementacja protokołu serwera językowego dla Rusta, zapewniająca diagnostykę w czasie rzeczywistym, uzupełnianie, przechodzenie do definicji i wbudowane ostrzeżenia Clippy w dowolnym edytorze zgodnym z LSP. Zastąpił on przestarzały RLS (Rust Language Server) i powinien być jedynym serwerem językowym używanym w nowych projektach.

Z perspektywy analizy statycznej, Rust Analyzer wyświetla znaczniki Clippy w linii w miarę pisania kodu przez programistę, zapewniając natychmiastową informację zwrotną na temat problemów ze stylem i poprawnością w momencie wprowadzenia kodu, zamiast wymagać osobnego uruchomienia terminala:

json

// VS Code settings.json: enable Clippy via rust-analyzer
{
  "rust-analyzer.check.command": "clippy",
  "rust-analyzer.check.extraArgs": [
    "--", "-W", "clippy::all", "-W", "clippy::pedantic"
  ]
}

rust-analyzer zapewnia także wskazówki dotyczące wywnioskowanych typów, okresów życia pożyczek i nazw parametrów, które są przydatne podczas przeglądania nieznanego kodu bez konieczności przechodzenia do definicji.

Warstwa 2: Zależność i bezpieczeństwo łańcucha dostaw

audyt ładunku

kontrola ładunku Cargo.lock Plik w bazie danych RustSec Advisory Database, identyfikując znane luki CVE w zależnościach bezpośrednich i przechodnich. Jest to minimalne narzędzie do zabezpieczania zależności, które każdy projekt Rust powinien uruchomić w ramach CI.

bash

# Install
cargo install cargo-audit

# Run audit
cargo audit

# Ignore a specific advisory (document the reason in comments)
cargo audit --ignore RUSTSEC-2024-0001

# JSON output for pipeline integration
cargo audit --json | jq '.vulnerabilities'

Cargo-audit obejmuje wyłącznie znane, opublikowane ostrzeżenia. Nie wykrywa luk w kodzie, problemów, które nie zostały jeszcze uwzględnione w bazie danych RustSec, ani naruszeń zasad, takich jak niechciane licencje.

odmowa ładunku

cargo-deny rozszerza zarządzanie zależnościami poza znane CVE, zapewniając zgodność z licencjami, wykrywanie duplikatów skrzynek oraz niestandardowe zasady blokowania/zezwalania. Jest to bardziej kompleksowe narzędzie dla organizacji z wymaganiami dotyczącymi zgodności:

toml

# deny.toml
[advisories]
vulnerability = "deny"
unmaintained = "warn"

[licenses]
allow = ["MIT", "Apache-2.0", "ISC", "BSD-2-Clause", "BSD-3-Clause"]
deny = ["GPL-2.0"]
copyleft = "warn"

[bans]
multiple-versions = "warn"

bash

cargo install cargo-deny
cargo deny check

ładunek podlegający audytowi

cargo-auditable osadza kompletne drzewo zależności w skompilowanych plikach binarnych Rust jako ustrukturyzowane metadane w dedykowanej sekcji linkera. Umożliwia to audyt wdrożonych plików binarnych bez dostępu do kodu źródłowego, co jest cenne dla kontroli bezpieczeństwa po wdrożeniu i przejrzystości łańcucha dostaw:

bash

cargo install cargo-auditable
cargo auditable build --release
# The binary now contains auditable dependency metadata
# Audit a binary directly:
cargo audit bin ./target/release/my-service

Warstwa 3: Głęboka weryfikacja

Narzędzia w tej warstwie wymagają bardziej złożonej konfiguracji, większej wiedzy specjalistycznej i dłuższego czasu analizy. Nie są one odpowiednie dla każdej funkcji w każdej bazie kodu. Są niezbędne w przypadku niebezpiecznego kodu, implementacji kryptograficznych, logiki parsera obsługującej niezaufane dane wejściowe oraz każdego kodu, którego poprawność wymaga potwierdzenia, a nie testowania.

Miri: Wykrywanie niezdefiniowanego zachowania

Miri to interpreter języka Rust dla metody Mid-Level Intermediate Representation (MIR), która wykonuje kod w sposób wykrywający niezdefiniowane zachowania dozwolone przez kompilator, ale naruszające gwarancje bezpieczeństwa języka Rust: dostęp do pamięci poza zakresem w niebezpiecznych blokach, użycie po zwolnieniu, nieprawidłowo wyrównane dereferencje wskaźników, wyścigi danych w wielowątkowym niebezpiecznym kodzie i naruszenia modelu aliasingu języka Rust.

bash

# Install Miri (requires nightly)
rustup +nightly component add miri

# Run tests under Miri
cargo +nightly miri test

# Enable strict aliasing validation
MIRIFLAGS="-Zmiri-strict-provenance" cargo +nightly miri test

Co wykrywa Miri:niezdefiniowane zachowanie w unsafe bloki, naruszenia dostępu do pamięci, użycie po zwolnieniu, nieprawidłowo wyrównane dostępy, przepełnienie całkowite w kompilacjach debugowych, wyścigi danych w niebezpiecznym kodzie współbieżnym.

Czego Miri nie obejmuje:błędy logiczne w bezpiecznym kodzie, które nie wiążą się z niezdefiniowanym zachowaniem, lukami w zabezpieczeniach, stylem kodu ani problemami z wydajnością.

Integracja CI:Miri działa 10-50 razy wolniej niż cargo test. Uruchom go selektywnie na modułach zawierających unsafe kodu lub według harmonogramu nocnego, a nie przy każdym zatwierdzeniu:

jamla

- name: Miri on unsafe modules
  run: |
    rustup +nightly component add miri
    cargo +nightly miri test --package my-unsafe-crate

Kani: Weryfikacja modelu i weryfikacja formalna

Kani, opracowany przez Amazon Web Services, to narzędzie do weryfikacji modeli, które formalnie weryfikuje właściwości kodu Rust poprzez wyczerpującą eksplorację ścieżek wykonania aż do zdefiniowanego limitu. Podczas gdy Miri uruchamia rzeczywiste przypadki testowe i znajduje konkretne błędy, Kani dowodzi lub obala, że ​​właściwości są prawdziwe dla wszystkich danych wejściowych w zakresie analizy.

Kani wymaga napisania mechanizmów weryfikacyjnych: funkcji, które definiują przestrzeń wejściową i właściwości do weryfikacji:

spokój

#[cfg(kani)]
mod verification {
    use super::*;

    #[kani::proof]
    fn verify_add_no_overflow() {
        let a: u32 = kani::any();
        let b: u32 = kani::any();
        if a.checked_add(b).is_some() {
            let result = safe_add(a, b);
            assert!(result == a + b);
        }
    }
}

bash

cargo install --locked kani-verifier
cargo kani setup
cargo kani

Najlepiej nadaje się do: funkcji krytycznych dla bezpieczeństwa, implementacji protokołów, obliczeń arytmetycznych w kodzie finansowym lub kryptograficznym oraz wszelkich funkcji, w których konieczne jest udowodnienie, a nie tylko przetestowanie, poprawności właściwości.

MIRAI: Interpretacja abstrakcyjna i analiza skażeń

MIRAI, opracowany przez Facebook Research, wykorzystuje abstrakcyjną interpretację do analizy MIR języka Rust. Przeprowadza analizę międzyproceduralną, która śledzi przepływ wartości przez wywołania funkcji, wykrywając potencjalne paniki, naruszenia kontraktów i rozprzestrzenianie się skażeń w kodzie.

spokój

use mirai_annotations::*;

fn divide(a: i32, b: i32) -> i32 {
    precondition!(b != 0);  // MIRAI verifies all callers satisfy this
    a / b
}

MIRAI wymaga nocnego kompilatora Rust i charakteryzuje się stromą krzywą konfiguracji, co sprawia, że ​​jest najbardziej odpowiedni dla zespołów z dedykowanymi możliwościami inżynierii bezpieczeństwa lub wymaganiami jakościowymi zorientowanymi na badania.

Rudra: Bezpieczeństwo pamięci w niebezpiecznym kodzie bibliotecznym

Rudra przeprowadza analizę całego programu w skrzyniach, aby wykryć błędy bezpieczeństwa pamięci specyficzne dla modelu własności Rusta: naruszenia bezpieczeństwa cech wysyłania/synchronizacji, problemy z czasem życia wyższych rodzajów, które pozwalają na niepoprawne wydłużenie czasu życia, oraz problemy z bezpieczeństwem typu panic w niebezpiecznym kodzie. Pierwotnie opracowana przez badaczy, działa jako wtyczka kompilatora i wymaga określonej wersji nocnej. Uruchamiaj ją planowo dla skrzyń bibliotecznych z niebezpiecznymi elementami wewnętrznymi, a nie przy każdym zatwierdzeniu.

Creusot i Prusti: Weryfikacja dedukcyjna

Creusot i Prusti to narzędzia do weryfikacji dedukcyjnej, które dowodzą matematycznych właściwości programów w języku Rust. Oba wymagają formalnych specyfikacji (warunków wstępnych, końcowych, niezmienników pętli) i wykorzystują automatyczne dowodzenia twierdzeń do weryfikacji implementacji pod kątem tych specyfikacji. Są one przeznaczone dla ograniczonego podzbioru bezpiecznego języka Rust i wymagają znajomości metod formalnych. Są odpowiednie dla regulowanych branż, rozwoju bibliotek kryptograficznych oraz w każdym kontekście, w którym matematyczny dowód poprawności jest wymogiem umownym lub regulacyjnym.

Dodatkowe narzędzia warte uwzględnienia

Semgrep dla niestandardowych wzorców zabezpieczeń

Semgrep zapewnia statyczną analizę opartą na wzorcach, która działa jednocześnie w wielu językach. W przypadku Rusta umożliwia zespołom tworzenie niestandardowych reguł wymuszających polityki bezpieczeństwa organizacji i wzorców specyficznych dla bazy kodu, których Clippy nie jest w stanie wyrazić:

jamla

# Custom rule: flag .unwrap() in production paths
rules:
  - id: no-unwrap-in-production
    pattern: $X.unwrap()
    message: "Use proper error handling instead of .unwrap()"
    languages: [rust]
    severity: WARNING

Semgrep zapewnia również zarządzany rejestr reguł z regułami bezpieczeństwa Rust zarządzanymi przez społeczność.

SonarCloud / SonarQube dla bramek ciągłej jakości

SonarCloud zapewnia ciągłą analizę jakości kodu z pulpitem nawigacyjnym, śledzeniem trendów i dekoracją pull requestów. Obsługa Rusta obejmuje typowe wzorce błędów, hotspoty bezpieczeństwa i problemy z kodem. Dla zespołów korporacyjnych, które już korzystają z SonarCloud w innych językach programowania, dodanie Rusta do tego samego potoku zapewnia ujednolicony wgląd w jakość w całym stosie.

Budowanie warstwowego procesu CI/CD

Poniższy przepływ pracy GitHub Actions stanowi praktyczny punkt wyjścia dla zespołów, które chcą uzyskać kompleksowe pokrycie jakościowe Rust bez nadmiernej inżynierii:

jamla

# .github/workflows/quality.yml
name: Code Quality and Security

on: [push, pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy, rustfmt

      - name: Check formatting
        run: cargo fmt -- --check

      - name: Clippy (treat warnings as errors)
        run: cargo clippy -- -D warnings

  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable

      - name: Install security tools
        run: |
          cargo install cargo-audit
          cargo install cargo-deny

      - name: Dependency audit
        run: cargo audit --deny warnings

      - name: License and policy check
        run: cargo deny check

  verify:
    runs-on: ubuntu-latest
    # Scheduled or manually triggered, not on every push
    if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@nightly
        with:
          components: miri

      - name: Miri on unsafe modules
        run: cargo +nightly miri test --package my-unsafe-crate

Którego narzędzia powinieneś użyć? Przewodnik decyzyjny

Rozpoczęcie nowego projektu Rust: Clippy + rustfmt + cargo-audit. Konfigurowalny w mniej niż pięć minut, wychwytuje większość problemów z jakością i bezpieczeństwem, z jakimi borykają się zespoły.

Usługa produkcyjna z zależnościami zewnętrznymi:Dodaj opcję odmowy przewozu w celu zapewnienia zgodności z licencją i egzekwowania polityki łańcucha dostaw wykraczającej poza CVE.

Skrzynia biblioteczna z niebezpiecznymi elementami wewnętrznymi: Dodaj Miri do zestawu testowego dla modułów zawierających niebezpieczny kod. Uruchom Rudrę zgodnie z harmonogramem.

Kod krytyczny dla bezpieczeństwa lub kod kryptograficzny: Napisz procedury weryfikacji Kani dla najważniejszych funkcji. Rozważ Creusota lub Prustiego, jeśli zespół ma doświadczenie w stosowaniu metod formalnych.

Organizacja skoncentrowana na bezpieczeństwie:Dodaj Semgrep z niestandardowymi regułami dla polityk bezpieczeństwa organizacji, a także funkcję cargo-auditable w kompilacjach wydań.

Ciągła widoczność dla większego zespołu:SonarCloud do śledzenia trendów, dekorowania żądań ściągnięcia i bram jakościowych obok narzędzi open source.

Środowisko przedsiębiorstwa wielojęzycznego gdzie Rust wchodzi w interakcje z COBOL-em, Javą i innymi starszymi językami: narzędzia Rust przeznaczone dla jednego języka nie potrafią wykraczać poza granice języka. SMART TS XL zapewnia analizę międzyjęzykową obejmującą cały system.

Kiedy analiza statyczna Rust spotyka się z systemami korporacyjnymi

Rust jest coraz częściej wykorzystywany w nowych usługach w organizacjach, które korzystają również z języków COBOL, Java, PL/I lub RPG na komputerach mainframe lub starszych platformach. W tych środowiskach zakres analizy statycznej wykracza poza możliwości narzędzi specyficznych dla Rusta. Mikrousługa Rust może wywoływać program COBOL, zapisywać dane do współdzielonej bazy danych lub przetwarzać zdarzenia generowane przez starszy system wsadowy. Analiza jakości i zależności, która ma znaczenie dla architekta przedsiębiorstwa, obejmuje wszystkie te systemy jednocześnie.

SMART TS XL rozwiązuje tę lukę, zapewniając analizę zależności międzyjęzykowych w całym portfolio aplikacji. Podczas gdy Clippy i cargo-audit widzą tylko Rusta, SMART TS XL Mapuje zależność usługi Rust od współdzielonych struktur danych, starszych programów i interfejsów API przedsiębiorstwa oraz wpływ zmiany którejkolwiek z tych zależności. To sprawia, że ​​jest to narzędzie pierwszego wyboru dla analiza wpływu oraz planowanie modernizacji dziedzictwa w środowiskach, w których Rust jest tylko jednym z wielu języków.

W przypadku zespołów wdrażających Rust stopniowo w ramach większej bazy kodu przedsiębiorstwa, SMART TS XL'S statyczna analiza kodu Zapewnia widoczność strukturalną niezbędną do zrozumienia, jak komponenty Rust wpisują się w szerszy system, zanim wprowadzi się zmiany, które mogłyby wpłynąć na komponenty napisane w innych językach. Jak zbadano w kontekście wykresy zależności i ryzyko aplikacjimapowanie pełnej struktury zależności przed rozszerzeniem systemu jest czynnikiem oddzielającym zmiany przebiegające bezproblemowo od tych, które powodują awarie w komponentach, których nikt nie pomyślał o przetestowaniu.

Warstwowe podejście jest sednem sprawy

Analiza statyczna w Rust to nie decyzja dotycząca pojedynczego narzędzia. To wielowarstwowa dyscyplina, która zaczyna się od tego, co kompilator oferuje za darmo, i rozszerza się na zewnątrz, w zależności od profilu ryzyka kodu. Clippy i rustfmt to podstawa. Cargo-audit jest nie do negocjacji w każdym projekcie z zależnościami zewnętrznymi. Miri należy do każdego projektu z niebezpiecznym kodem. Kani i narzędzia do weryfikacji formalnej są przeznaczone dla funkcji, w których błąd jest niedopuszczalny.

Zespoły, którym się to udaje, integrują analizę statyczną z pętlą rozwoju: Clippy inline w edytorze, cargo-audit w każdym przebiegu CI oraz Miri w nocnym zadaniu, które wychwytuje to, czego nie potrafią same testy. Rezultatem jest nie tylko mniej błędów. To pewność co do bazy kodu, która pozwala zespołom szybko wprowadzać zmiany, wiedząc, że warstwy analizy między programistą a środowiskiem produkcyjnym działają poprawnie.