Rust Developeri staatilise koodi analüüsi tööriistad

Rusti arendaja tööriistakast: parimad staatilise koodi analüüsi tööriistad

Rusti kompilaator on kõige arvamuslikum koodiarvustaja, millega enamik arendajaid kunagi koostööd teeb. Selle omandiõigussüsteem, laenukontrollija ja eluaegne jõustamine kõrvaldavad terved vigade kategooriad, mis vaevavad C ja C++ koodibaase. Kuid kompilaator, mis ennetab mäluvigu, ei ole sama mis terviklik kvaliteedisüsteem. Loogilised vead, ebaturvalised sõltuvusahelad, ohtlike plokkide väärkasutamine, jõudluse antimustrid ja stiili nihe jäävad kõik püsima. rustcMeeskonnad, kes pakuvad usaldusväärset Rusti suures mahus, ühendavad kompilaatori kihiliste staatiliste analüüsitööriistadega, millest igaüks katab kvaliteedipinna erineva osa.

Vale kombinatsiooni valimine raiskab CI aega ja tekitab müra, mida arendajad õpivad ignoreerima. Õige kombinatsiooni valimine paneb kompilaatori ranguse tunduma pigem põrandana kui laena. Selle juhendi tööriistad on järjestatud vastavalt sellele, mida nad tegelikult teevad, mitte tähestikulises järjekorras, nii et meeskonnad saavad luua virna, mis hõlmab kõiki kolme kvaliteedikihti: linting ja idioomid, sõltuvuste turvalisus ning süvakontroll ohutuskriitilise või turvatundliku koodi jaoks.

SMART TS XL

Kvaliteedi säilitamine tänapäevases Rusti arenduses on keeruline isegi keele tugevate turvagarantiide korral. SMART TS XL on loodud meeskondade abistamiseks usaldusväärse, hooldatava ja turvalise tarkvara loomisel, pakkudes Rusti ainulaadsetele funktsioonidele kohandatud süva staatilise analüüsi võimalusi. See toetab professionaalseid inseneritöövooge, avastades probleemid varakult, tagades järjepidevuse ja vähendades käsitsi ülevaatamise pingutust.

Rooste kolm kihti staatiline analüüs

Tööriista kuhu kuulumise mõistmine hoiab ära levinud vea, kus kasutatakse ametlikku verifitseerijat seal, kus piisab linterist, või linterile lootmist seal, kus on vaja turvaskannerit. Iga küps Rusti projekt peaks katma kõik kolm kihti.

1. kiht: Linting ja stiil Tuvastab idioomaatilised rikkumised, levinud vead ja hooldatavuse probleemid. Tööriistad: Clippy, rustfmt, rust-analyzer.

2. kiht: sõltuvus ja tarneahela turvalisus Auditeerib kolmandate osapoolte kaste teadaolevate haavatavuste ja eeskirjade rikkumiste suhtes. Tööriistad: cargo-audit, cargo-deny, cargo-auditable.

3. kiht: süvakontroll leiab mälu turvalisuse probleeme ebaturvalises koodis ja defineerimata käitumises ning tõestab formaalselt kriitiliste funktsioonide omadusi. Tööriistad: Miri, Kani, MIRAI, Rudra, Creusot, Prusti.

Allolev tabel kaardistab iga peamise tööriista selle kihi, maksumuse, usaldusintervalli sobivuse ja peamise kasutusjuhtumi järgi:

VahendkihtMaksmaCI-sobivEsmane kasutusjuht
ClippyvooderTasuta / OSSJahIdiomaatiline linting, stiil, tavalised vead
rustfmtvooderTasuta / OSSJahKoodi vormindamise jõustamine
roosteanalüsaatorLinting / DXTasuta / OSSOsalineIDE diagnostika, reaanalüüs
lastiauditSõltuvuste turvalisusTasuta / OSSJahKastides olevad teadaolevad CVE-d
lasti keelamineSõltuvuste turvalisusTasuta / OSSJahLitsents, duplikaadid, teated
lasti auditeeritavSõltuvuste turvalisusTasuta / OSSJahSõltuvusandmete manustamine binaarfailidesse
MiriPõhjalik kontrollimineTasuta / OSSSelektiivneMääratlemata käitumine ebaturvalises koodis
KaniPõhjalik kontrollimineTasuta / OSSSelektiivneFormaalne verifitseerimine, mudeli kontrollimine
MIRAIPõhjalik kontrollimineTasuta / OSSSelektiivneAbstraktne tõlgendamine, plekianalüüs
RudraPõhjalik kontrollimineTasuta / OSSuurimistööMälu turvavead ebaturvalises Rustis
SemgrepLäbilõikavTasuta + tasuline taseJahKohandatud turvamustrid, mitmekeelne
SonarCloudLäbilõikavTasuta + tasuline taseJahPidev kvaliteetvärav, armatuurlauad

1. kiht: Linting, stiil ja arendajakogemus

Clippy

Clippy on Rusti staatilise analüüsi lõplik lähtepunkt. See tarnitakse koos ametliku Rusti tööriistakomplektiga ning pakub üle 700 lingi, mis hõlmavad korrektsust, jõudlust, stiili, keerukust ja piiranguid. See on tööriist, mida enamik Rusti meeskondi iga päev kasutab ja see on mõistetav: see püüab kinni päris vigu, mitte ainult stiiliarvamusi.

sisse lööma

# 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

Clippy lint-kategooriaid tasub selgesõnaliselt mõista:

KategooriaMida see püüab
correctnessKood, mis on peaaegu kindlasti vale (alati eita)
suspiciousKood, mis on tõenäoliselt vale või väga üllatav
styleMitteidiomaatilised mustrid selge paranemisega
complexityTarbetult keerulised konstruktsioonid
performanceKood, mis kompileerub, aga töötab aeglasemalt kui peaks
pedanticRanged juhised, arvamusavaldused (võimaldage valikuliselt)
restrictionReeglid, mida võiksite teatud kontekstides jõustada
nurseryUued ebemed võivad anda valepositiivseid tulemusi

lastikontroll vs clippy: cargo check Kontrollib tüübi õigsust ja kompileerimist ilma binaarfaili genereerimata. See on kiire ja sobib ehituse kontrollimiseks. cargo clippy jookseb cargo check pluss kõik ebemeanalüüsid. CI jaoks käivitage cargo check kiire kompileerimise tagasiside saamiseks ja cargo clippy -- -D warnings eraldi kvaliteetväravana. Need ei ole omavahel asendatavad: cargo check ei taba idioomaatilised probleemid ja cargo clippy on aeglasem.

Clippy seadistamine kaudu clippy.toml või reasisesed atribuudid annavad meeskondadele kontrolli müra üle:

toml

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

rooste

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

Mida Clippy ei kata: süvaanalüüsi andmevoogude osas moodulite vahel, turvanõrkuste skaneerimist sõltuvustes, õigsuse ametlikku tõestamist ega kohandatud organisatsioonispetsiifilisi reegleid. Need nõuavad tööriistu teistes kihtides.

rustfmt

rustfmt rakendab kogu koodibaasis ühtset vormindamist, kasutades cargo fmt. rustfmt.toml konfiguratsioonifail määrab projektiülesed stiilireeglid. CI-s cargo fmt -- --check väljub nullist erineva koodiga, kui mõni fail ümber vormindatakse, muutes selle puhtaks kvaliteediväravaks ilma konfiguratsioonikuludeta:

sisse lööma

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

# Apply formatting (developer mode)
cargo fmt

roosteanalüsaatori ja IDE integratsiooni

rust-analyzer on Rusti keeleserveri protokolli implementatsioon, mis pakub reaalajas diagnostikat, lõpetamist, definitsioonile minekut ja Clippy hoiatusi mis tahes LSP-ühilduvas redaktoris. See asendas aegunud RLS-i (Rust Language Server) ja peaks olema ainus keeleserver, mida uutes projektides kasutatakse.

Staatilise analüüsi vaatenurgast kuvab roosteanalüsaator Clippy lintsid arendajate tippimise ajal otse tekstis, andes kohe tagasisidet stiili ja õigsuse probleemide kohta juba sisestamise hetkel, selle asemel et eraldi terminali käivitamist nõuda:

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 pakub ka sisemisi vihjeid järeldatud tüüpide, laenatud eluaegade ja parameetrite nimede kohta, mis on kasulikud tundmatu koodi ülevaatamiseks ilma definitsioonideni navigeerimata.

2. kiht: sõltuvus ja tarneahela turvalisus

lastiaudit

lastiaudit kontrollib Cargo.lock fail RustSeci nõuandeandmebaasi vastu, tuvastades teadaolevad CVE-d otsestes ja transitiivsetes sõltuvustes. See on minimaalne sõltuvusturbe tööriist, mida iga Rusti projekt peaks CI-s käivitama.

sisse lööma

# 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 hõlmab ainult teadaolevaid ja avaldatud nõuandeid. See ei suuda tuvastada teie enda koodi haavatavusi, probleeme, mida veel RustSeci andmebaasis pole, ega poliitikarikkumisi, näiteks soovimatuid litsentse.

lasti keelamine

Cargo-deny laiendab sõltuvuste haldust teadaolevatest CVE-dest litsentside vastavuse, duplikaatkastide tuvastamise ja kohandatud keelustamis-/lubamispoliitikate haldamiseni. See on terviklikum tööriist organisatsioonidele, kellel on vastavusnõuded:

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"

sisse lööma

cargo install cargo-deny
cargo deny check

lasti auditeeritav

cargo-auditable manustab kogu sõltuvuspuu kompileeritud Rusti binaarfailidesse struktureeritud metaandmetena spetsiaalsesse linkersektsiooni. See võimaldab auditeerida juurutatud binaarfaile ilma lähtekoodile juurdepääsuta, mis on väärtuslik juurutamisjärgse turvalisuse ülevaatuse ja tarneahela läbipaistvuse jaoks:

sisse lööma

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

3. kiht: süvakontroll

Selle kihi tööriistad nõuavad rohkem seadistamist, rohkem oskusteavet ja pikemat analüüsiaega. Need ei sobi iga funktsiooni jaoks igas koodibaasis. Need on olulised ebaturvalise koodi, krüptograafiliste implementatsioonide, ebausaldusväärse sisendiga töötava parseriloogika ja mis tahes koodi puhul, mille õigsust tuleb pigem tõestada kui testida.

Miri: Määratlemata käitumise tuvastamine

Miri on Rusti keskmise taseme esituse (MIR) interpretaator, mis käivitab koodi viisil, mis tuvastab kompilaatori lubatud määratlemata käitumise, kuid mis rikub Rusti ohutusgarantiisid: piiridest väljas mälule juurdepääs ohtlikes plokkides, kasutamine pärast vabastamist, valesti joondatud pointeri viited, andmevõistlused mitmelõimelises ohtlikus koodis ja Rusti aliaseerimismudeli rikkumised.

sisse lööma

# 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

Mida Miri tuvastab: määratlemata käitumine unsafe plokid, mälule juurdepääsu rikkumised, pärast vabastamist kasutus, valesti joondatud juurdepääsud, täisarvude ületäitumine silumisjärgus, andmevõidujooks ebaturvalises samaaegses koodis.

Mida Miri ei kata: turvalise koodi loogikavead, mis ei hõlma määratlemata käitumist, sõltuvushaavatavusi, koodistiili ega jõudlusprobleeme.

CI-integratsioonMiri töötab 10–50 korda aeglasemalt kui cargo testKäivita see valikuliselt moodulitel, mis sisaldavad unsafe koodi või igal õhtul, mitte iga commit'i ajal:

yaml

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

Kani: mudeli kontrollimine ja formaalne verifitseerimine

Amazon Web Servicesi arendatud Kani on mudelikontrollija, mis kontrollib formaalselt Rusti koodi omadusi, uurides põhjalikult täitmisteid kuni määratletud piirini. Kui Miri käivitab tegelikke testjuhtumeid ja leiab konkreetseid vigu, siis Kani tõestab või lükkab ümber, et omadused kehtivad kõigi oma analüüsiulatuses olevate sisendite puhul.

Kani nõuab verifitseerimisfunktsioonide kirjutamist: need on funktsioonid, mis määratlevad sisendruumi ja kontrollitavad omadused:

rooste

#[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);
        }
    }
}

sisse lööma

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

Sobib kõige paremini: ohutuskriitilisteks funktsioonideks, protokollide rakendamiseks, finants- või krüptograafilise koodi aritmeetikaks ja igaks funktsiooniks, kus on vaja õigsust tõestada, mitte ainult testida.

MIRAI: abstraktne tõlgendamine ja värvimuutuste analüüs

Facebook Researchi väljatöötatud MIRAI kasutab Rusti MIR-i analüüsimiseks abstraktset interpretatsiooni. See teostab interprotseduraalset analüüsi, mis jälgib väärtuste liikumist funktsioonikõnede kaudu, tuvastades võimalikke paanilisi olukordi, lepingu rikkumisi ja koodi kaudu levivat koodiriket.

rooste

use mirai_annotations::*;

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

MIRAI vajab iga öist Rusti kompilaatorit ja sellel on järsk seadistuskõver, mistõttu sobib see kõige paremini meeskondadele, kellel on spetsiaalne turvainseneri võimekus või uurimistööle suunatud kvaliteedinõuded.

Rudra: Mälu turvalisus ebaturvalises raamatukogukoodis

Rudra teostab programmiülese analüüsi kõigis kastides, et tuvastada Rusti omandimudelile omaseid mälu turvavead: saatmise/sünkroonimise tunnuste turvarikkumised, kõrgema astme eluea probleemid, mis võimaldavad ebamõistlikku eluea pikendamist, ja paanika turvaprobleemid ebaturvalises koodis. Algselt teadlaste poolt välja töötatud see toimib kompilaatori pluginana ja nõuab kindlat öist versiooni. Käivitage seda ajakava alusel ebaturvaliste sisemustega teekide kastide puhul, mitte iga commit'i korral.

Creusot ja Prusti: Deduktiivne verifitseerimine

Creusot ja Prusti on deduktiivsed verifitseerimisvahendid, mis tõestavad Rusti programmide matemaatilisi omadusi. Mõlemad nõuavad formaalseid spetsifikatsioone (eeltingimused, järeltingimused, tsükliinvariantsid) ja kasutavad automatiseeritud teoreemitõestajaid implementatsioonide kontrollimiseks nende spetsifikatsioonide alusel. Need on suunatud turvalise Rusti piiratud alamhulgale ja nõuavad formaalsete meetodite oskusteavet. Sobib reguleeritud tööstusharudele, krüptoteegi arendamiseks või mis tahes konteksti jaoks, kus õigsuse matemaatiline tõestamine on lepinguline või regulatiivne nõue.

Lisatööriistad, mida tasub kaasata

Semgrep kohandatud turvamustrite jaoks

Semgrep pakub mustripõhist staatilist analüüsi, mis töötab samaaegselt mitmes keeles. Rusti puhul võimaldab see meeskondadel kirjutada kohandatud reegleid, mis jõustavad organisatsiooni turvapoliitikaid ja koodibaasile omaseid mustreid, mida Clippy ei suuda väljendada:

yaml

# 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 pakub ka hallatud reeglite registrit, mis sisaldab kogukonna hallatavaid Rusti turvareegleid.

SonarCloud / SonarQube pideva kvaliteedikontrolli jaoks

SonarCloud pakub pidevat koodikvaliteedi analüüsi armatuurlaua, trendide jälgimise ja pull request'i kujunduse abil. Selle Rusti tugi hõlmab levinud veamustreid, turvaauke ja koodilõhnasid. Ettevõtte meeskondadele, kes juba kasutavad SonarCloud'i teiste keelte jaoks, pakub Rusti lisamine samasse torujuhtmesse ühtset kvaliteedinähtavust kogu pinus.

Kihilise CI/CD torujuhtme loomine

Järgnev GitHub Actionsi töövoog on praktiline lähtepunkt meeskondadele, kes soovivad Rusti kvaliteedi põhjalikku katvust ilma liigse inseneritööta:

yaml

# .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

Millist tööriista peaksite kasutama? Otsustusjuhend

Uue Rust projekti alustamineClippy + rustfmt + cargo-audit. Konfigureeritav alla viie minutiga, tabab enamiku kvaliteedi- ja turvaprobleemidest, millega meeskonnad kokku puutuvad.

Tootmisteenus koos väliste sõltuvustegaLisa lasti keelamise funktsioon litsentside järgimise ja tarneahela eeskirjade jõustamise tagamiseks lisaks CVE-dele.

Raamatukogukast ohtlike sisemustegaLisa Miri oma testimiskomplekti moodulite jaoks, mis sisaldavad ohtlikku koodi. Käita Rudrat ajakava alusel.

Ohutuskriitiline või krüptograafiline koodKirjutage kõige kriitilisemate funktsioonide jaoks Kani verifitseerimismeetodid. Kui meeskonnal on formaalsete meetodite tundmine, kaaluge Creusot' või Prusti kasutamist.

Turvalisusele keskendunud organisatsioonLisatud on Semgrep koos kohandatud reeglitega organisatsiooni turbepoliitikate jaoks ning lisaks on see väljalaskejärgustes Cargo-auditeeritav.

Pidev nähtavus suuremale meeskonnaleSonarCloud trendide jälgimiseks, pull requestide kaunistamiseks ja kvaliteediväravate jaoks koos avatud lähtekoodiga tööriistadega.

Polüglottide ettevõttekeskkond kus Rust suhtleb COBOLi, Java või muude pärandkeeltega: ühekeelsed Rusti tööriistad ei näe keelepiiridest üle. SMART TS XL pakub kogu süsteemi hõlmavat keeltevahelist analüüsi.

Kui rooste staatiline analüüs kohtub ettevõtte süsteemidega

Rusti kasutatakse üha enam uute teenuste jaoks organisatsioonides, mis käitavad suurarvutitel või pärandplatvormidel ka COBOLi, Java, PL/I või RPG-d. Nendes keskkondades ulatub staatilise analüüsi pilt kaugemale sellest, mida ükski Rusti-spetsiifiline tööriist näeb. Rusti mikroteenus võib kutsuda COBOL-programmi, kirjutada jagatud andmebaasi või tarbida pärandpakettsüsteemi loodud sündmusi. Ettevõtte arhitekti jaoks oluline kvaliteedi- ja sõltuvusanalüüs hõlmab kõiki neid süsteeme samaaegselt.

SMART TS XL lahendab selle lünga, pakkudes keeltevahelist sõltuvusanalüüsi kogu rakenduste portfelli ulatuses. Kui Clippy ja cargo-audit näevad ainult Rusti, SMART TS XL kaardistab, kuidas Rusti teenus sõltub jagatud andmestruktuuridest, pärandprogrammidest ja ettevõtte API-dest ning milline oleks nende sõltuvuste muutmise mõju. See teeb sellest eelistatud tööriista mõju analüüs ja pärandmoderniseerimise planeerimine keskkondades, kus Rust on üks keel paljude seas.

Meeskondadele, kes võtavad Rusti kasutusele järk-järgult suurema ettevõtte koodibaasis, SMART TS XL'S staatilise koodi analüüs annab struktuurilise nähtavuse, mis on vajalik, et mõista, kuidas Rusti komponendid suuremasse süsteemi sobivad, enne kui tehakse muudatusi, mis võivad mõjutada teistes keeltes kirjutatud komponente. Nagu on uuritud kontekstis sõltuvusgraafikud ja rakenduse riskKogu sõltuvusstruktuuri kaardistamine enne süsteemi laiendamist eristab sujuvalt kulgevaid muudatusi nendest, mis põhjustavad tõrkeid komponentides, mida keegi pole tulnudki testima.

Kihiline lähenemine ongi mõte

Staatiline analüüs Rustis ei ole ühe tööriista valik. See on kihiline distsipliin, mis algab sellest, mida kompilaator teile tasuta pakub, ja laieneb väljapoole teie koodi riskiprofiili põhjal. Clippy ja rustfmt on aluseks. Cargo-audit ei ole väliste sõltuvustega projektide puhul läbiräägitav. Miri sobib igasse projekti, mille kood on ebaturvaline. Kani ja formaalsed verifitseerimisvahendid on mõeldud funktsioonidele, kus valesti tegemine on vastuvõetamatu.

Meeskonnad, kes selle õigesti teevad, integreerivad staatilise analüüsi arendustsüklisse: Clippy otse redaktorisse, Cargo-audit igasse CI-tsüklisse ja Miri öisesse töösse, mis tabab selle, mida testid üksi ei suuda. Tulemuseks pole lihtsalt vähem vigu. See on selline usaldus koodibaasi vastu, mis võimaldab meeskondadel kiiresti muudatusi teha, teades, et arendaja ja tootmiskeskkonna vahelised analüüsikihid toimivad õigesti.