Panoramica dell'analisi del codice per i driver

Windows Driver Kit fornisce un'estensione specifica del driver allo strumento Analisi del codice in Microsoft Visual Studio. L'analisi del codice per i driver include regole che si applicano solo ai driver, in particolare i driver in modalità kernel. L'analisi del codice per i driver può rilevare potenziali errori nel codice non appena è possibile compilare il codice.

Funzionamento dello strumento analisi del codice

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

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

I tipi di analisi del codice di errore possono 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 le risorse che non devono essere mantenute quando si chiamano altre funzioni.

  • Uso della funzione: Potenzialmente non corretto uso di determinate funzioni, argomenti di funzione che appaiono non corretti, possibili errori di tipo di argomento per le funzioni che non controllano strettamente 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 programmatore previsto a causa delle regole di precedenza della programmazione C.

  • Procedure di codifica in modalità kernel: Le procedure di codifica che possono causare errori, ad esempio la modifica di una struttura di descrittore di memoria opaca (MDL), non riesce ad esaminare il valore di una variabile impostata da una funzione denominata e l'uso delle funzioni di manipolazione delle stringhe C/C++ anziché le funzioni stringa sicure definite in Ntstrsafe.h.

  • Procedure di codifica specifiche del driver: Operazioni specifiche che spesso sono 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 a un argomento stringa o struttura anziché copiare un argomento in una routine DriverEntry .

Avvisi di analisi del codice

Lo strumento Analisi del 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 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 analisi del codice nei report di Visual Studio, vedere Avvisi di analisi del codice.

Annotazioni

Una delle funzionalità importanti offerte dallo strumento Analisi codice è la possibilità di annotare le descrizioni delle funzioni e alcune altre entità nel codice sorgente del driver. Lo strumento Analisi del codice ha un ambito intra-funzionale; ovvero analizza le interazioni tra 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 analisi del codice possa verificare che il contratto venga 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 la modalità di raggiungimento del contratto. In molti casi, i risultati dell'esecuzione dello strumento Analisi codice riflettono l'assenza di un'annotazione appropriata e aggiungendo l'annotazione, sia l'avviso relativo all'annotazione mancante che i controlli aggiuntivi sono abilitati. Per altre informazioni, vedere Annotazioni SAL 2.0 per i driver di Windows. Altre informazioni su SAL 2.0, vedere Uso di 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. Se sono necessarie informazioni su SAL 1.0 per i driver, vedere la documentazione PREfast for Driver Annotations fornita con WDK per Windows 7.

Interpretazione del risultato

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

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 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 esame attento, 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 Analisi del codice per i driver.

Come eseguire l'analisi del codice per i driver

Strumento di analisi del codice in Visual Studio

Avvisi di Code Analysis for Drivers

Avvisi di analisi del codice

Annotazioni SAL 2.0 per i driver Windows