Panoramica dell'analisi del codice per i driver

Windows Driver Kit fornisce un'estensione specifica del driver per lo strumento di analisi del codice in Microsoft Visual Studio. L'analisi del codice per i driver include regole applicabili solo ai driver, in particolare ai driver in modalità kernel. L'analisi del codice per i driver può rilevare potenziali errori nel codice non appena il codice può essere compilato.

Importante

L'analisi del codice per i driver è disponibile in Windows 24H2 WDK e EWDK, ma è consigliabile che sia impostata per essere ritirata in una data futura.
In futuro, CodeQL sarà lo strumento di analisi statico principale per i driver. CodeQL offre un linguaggio di query potente che considera il codice come database su cui eseguire query, semplificando la scrittura di query per comportamenti, modelli e altro ancora specifici. Per altre informazioni sull'uso di CodeQL, vedere CodeQL e il test del logo degli strumenti statici.

Funzionamento dello strumento di analisi del codice

Lo strumento Analisi codice intercetta la chiamata dell'utilità di compilazione al compilatore standard, Cl.exe e, invece, esegue un compilatore cl intercetta che analizza il codice sorgente del driver e crea un file di log di messaggi di errore e di avviso. È possibile eseguire lo strumento di analisi del codice autonomamente oppure è possibile configurare lo strumento di analisi del codice da eseguire quando si compila il driver. Quando si esegue lo strumento di analisi del codice stesso (analizza l'esecuzione > dell'analisi del codice nella soluzione), i risultati vengono visualizzati nella finestra Report analisi codice. Quando si esegue lo strumento di analisi del codice come parte della compilazione, il compilatore CL intercetta crea un file di log di messaggi di errore e di avviso e quindi chiama la versione standard di Cl.exe per produrre l'output di compilazione. I file oggetto risultanti sono uguali a quelli prodotti da un comando di compilazione standard.

Quando viene eseguito il compilatore di intercettazione, l'analisi del codice per i driver esamina ogni funzione nel codice in modo indipendente e quindi simula l'esecuzione di tutti i percorsi possibili attraverso il codice, cercando errori comuni del driver e procedure di codifica non appropriate. Lo strumento di analisi del codice viene eseguito relativamente rapidamente, anche su driver di dimensioni maggiori e il report che genera identifica esattamente la riga di codice del driver con l'errore sospetto.

I tipi di errori che l'analisi del codice può rilevare

L'analisi del codice può rilevare diversi tipi di errori, inclusi gli errori nelle categorie seguenti:

  • Memoria: potenziali perdite di memoria, puntatori NULL dereferenziati, accesso alla memoria non inizializzata, uso eccessivo dello stack in modalità kernel e uso improprio dei tag del pool.

  • Risorse: non è possibile rilasciare risorse come blocchi, risorse che devono essere mantenute quando si chiamano alcune funzioni e risorse che non devono essere mantenute quando si chiamano altre funzioni.

  • Uso di funzioni: uso potenzialmente errato di determinate funzioni, argomenti di funzione che appaiono errati, possibili mancate corrispondenze del tipo di argomento per le funzioni che non controllano rigorosamente i tipi, possibile uso di determinate funzioni obsolete e chiamate di funzione a un IRQL potenzialmente errato.

  • Stato a virgola mobile: non è possibile proteggere lo stato hardware a virgola mobile in un driver e tentare di ripristinare lo stato a virgola mobile dopo averlo salvato in un irQL diverso.

  • Regole di precedenza: codice che potrebbe non comportarsi come previsto dal programmatore a causa delle regole di precedenza della programmazione C.

  • Procedure di codifica in modalità kernel: procedure di codifica che possono causare errori, ad esempio la modifica di una struttura MDL (Memory Descriptor List) opaca, la mancata analisi del valore di una variabile impostata da una funzione chiamata e l'uso di funzioni di manipolazione delle stringhe C/C++ anziché le funzioni di stringa sicure definite in Ntstrsafe.h.

  • Procedure di codifica specifiche del driver: operazioni specifiche che spesso rappresentano un'origine di errori nei driver in modalità kernel. Ad esempio, la copia di un intero pacchetto di richiesta di I/O (IRP) senza modificare i membri e salvare un puntatore in un argomento stringa o struttura anziché copiare un argomento in una routine DriverEntry.

Avvisi di analisi del codice

Lo strumento Analisi codice usa un modello basato su regole per identificare gli errori nel codice del programma o del driver. Ogni regola è associata a un avviso segnalato se lo strumento di analisi del codice rileva una violazione della regola. Per informazioni dettagliate sugli avvisi specifici del driver, vedere Analisi del codice per gli avvisi dei driver. Per informazioni sul set principale di avvisi che lo strumento di analisi del codice nei report di Visual Studio, vedere Avvisi di analisi del codice.

Annotazioni

Una delle funzionalità importanti offerte dallo strumento di analisi del codice è la possibilità di annotare le descrizioni delle funzioni e altre entità nel codice sorgente del driver. Lo strumento di analisi del codice ha un ambito intrafunzionale; ovvero analizza le interazioni tra le funzioni. L'obiettivo delle annotazioni consiste nel fornire un'espressione più completa del contratto tra le funzioni chiamate e chiamate, in modo che lo strumento di analisi del codice possa verificare che il contratto sia soddisfatto. Un altro obiettivo delle annotazioni è che informano chi legge il codice come deve essere usata la funzione e quali risultati possono essere previsti. Le annotazioni dichiarano il contratto dell'interfaccia e non tentano di descrivere come viene raggiunto il contratto. In molti casi, i risultati dell'esecuzione dello strumento analisi del codice riflettono l'assenza di un'annotazione appropriata e aggiungendo l'annotazione, l'avviso relativo all'annotazione mancante viene eliminato e vengono abilitati controlli aggiuntivi. Per altre informazioni, vedere Annotazioni SAL 2.0 per i driver Windows. Per altre informazioni su SAL 2.0, vedere Uso delle annotazioni SAL per ridurre i difetti del codice C/C++. SAL 2.0 sostituisce SAL 1.0. SAL 2.0 deve essere usato con WDK per Windows 8. Per informazioni su SAL 1.0 per i driver, vedere la documentazione relativa alle annotazioni PREfast per i driver fornita con WDK per Windows 7.

Interpretazione del risultato

L'analisi del codice per i driver è facile da eseguire e viene eseguita rapidamente, anche su driver e programmi molto grandi. Il lavoro per lo sviluppatore consiste nell'esaminare l'output, analizzare gli errori rilevati dallo strumento di analisi del codice e distinguere gli errori di codifica reali dal codice valido interpretato dallo strumento di analisi del codice.

Per un riferimento completo che descrive ogni avviso che lo strumento di analisi del codice potrebbe rilevare, vedere Analisi del codice per gli avvisi dei driver. Per informazioni sul set principale di avvisi che lo strumento di analisi del codice nei report di Visual Studio, vedere Avvisi di analisi del codice.

La risoluzione di un avviso di analisi del codice comporta in genere l'aggiornamento del codice sorgente quando appropriato o l'aggiunta di un'annotazione per chiarire il contratto di funzione. L'aggiunta di un'annotazione consente all'analizzatore di applicare il contratto per tutti i chiamanti futuri e migliora anche la leggibilità.

Se i risultati dell'analisi del codice mostrano errori che si determinano, dopo un'attenta analisi, non sono validi e non possono essere evitati anche con l'uso di annotazioni, è possibile scegliere di escludere o eliminare questi avvisi. Per altre informazioni, vedere Come eseguire l'analisi del codice per i driver.

Come eseguire l'analisi del codice per i driver

Strumento di analisi del codice in Visual Studio

Analisi del codice per gli avvisi dei driver

Avvisi di analisi del codice

Annotazioni SAL 2.0 per i driver di Windows