Procedura guidata: analisi del codice C/C++ per l'identificazione degli errori
In questa procedura dettagliata viene illustrato come analizzare il codice C/C++ per identificare errori potenziali del codice attraverso lo strumento di analisi del codice C/C++.
Verrà spiegato in modo dettagliato come utilizzare l'analisi del codice per esaminare il codice C/C++ con l'obiettivo di identificare errori potenziali.
Verranno completati i seguenti passaggi:
Eseguire l'analisi del codice su codice nativo.
Analizzare gli avvisi degli errori del codice.
Considerare l'avviso come un errore.
Annotare il codice sorgente per migliorare l'analisi degli errori del codice.
Prerequisiti
Visual Studio Premium o Visual Studio Ultimate.
Una copia di Esempio dimostrativo.
Concetti di base di C/C++.
Per eseguire l'analisi degli errori del codice su codice nativo
Aprire la soluzione Demo in Visual Studio.
A questo punto la soluzione Demo verrà inserita in Esplora soluzioni.
Scegliere Ricompila soluzione dal menu Compila.
La soluzione verrà compilata senza alcun errore o avviso.
In Esplora soluzioni selezionare il progetto CodeDefects.
Scegliere Proprietà dal menu Progetto.
Verrà visualizzata la finestra di dialogo Pagine delle proprietà CodeDefects.
Fare clic su Analisi codice.
Selezionare la casella di controllo Abilita analisi del codice per C/C++ in fase di compilazione.
Ricompilare il progetto CodeDefects.
Nell' Elenco errorivengono visualizzati gli avvisi dell'analisi del codice.
Per analizzare gli avvisi di errori del codice
Scegliere Elenco errori dal menu Visualizza.
In base al profilo dello sviluppatore scelto in Visual Studio, potrebbe essere necessario scegliere Altre finestre dal menu Visualizza, quindi fare clic su Elenco errori.
Nella finestra Elenco errori fare doppio clic sul seguente avviso:
avviso C6230: Cast implicito tra tipi integer semanticamente diversi: utilizzo di HRESULT in un contesto Booleano.
Nell'editor di codice viene visualizzata la riga che ha causato la generazione dell'avviso nella funzione boolProcessDomain().Questo avviso indica l'utilizzo di HRESULT in un'istruzione 'if' dove è previsto un risultato Booleano.
Risolvere il problema utilizzando la macro SUCCEEDED.L'aspetto del codice dovrebbe essere simile al seguente:
if (SUCCEEDED (ReadUserAccount()) )
Nella finestra Elenco errori fare doppio clic sul seguente avviso:
avviso C6282: Operatore errato: assegnazione di costante in contesto Booleano.Si consiglia di utilizzare '=='
Risolvere il problema eseguendo un test dell'uguaglianza.Il codice dovrebbe risultare simile al seguente:
if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != '\\'))
Per considerare l'avviso come un errore
Nel file Bug.cpp aggiungere la seguente istruzione #pragma all'inizio del file per considerare l'avviso C6001 come un errore:
#pragma warning (error: 6001)
Ricompilare il progetto CodeDefects.
Nella finestra Elenco errori C6001 appare ora come un errore.
Correggere i due errori C6001 residui nella finestra Elenco errori inizializzando i e j su 0.
Ricompilare il progetto CodeDefects.
Il progetto verrà compilato senza alcun avviso o errore.
Per correggere gli avvisi di annotazione del codice sorgente in annotation.c
Selezionare il progetto Annotations in Esplora soluzioni.
Scegliere Proprietà dal menu Progetto.
Verrà visualizzata la finestra di dialogo Pagine delle proprietà Annotations.
Fare clic su Analisi codice.
Selezionare la casella di controllo Abilita analisi del codice per C/C++ in fase di compilazione.
Ricompilare il progetto Annotations.
Nella finestra Elenco errori fare doppio clic sul seguente avviso:
avviso C6011: Dereferenziazione del puntatore NULL 'newNode'.
Questo avviso indica che il chiamante non è riuscito a controllare il valore restituito.In questo caso, una chiamata a AllocateNode potrebbe restituire un valore NULL (vedere il file di intestazione annotations.h per la dichiarazione di funzione relativa ad AllocateNode).
Aprire il file annotations.cpp.
Per risolvere il problema, utilizzare un'istruzione 'if' per verificare il valore restituito.L'aspetto del codice dovrebbe essere simile al seguente:
if (NULL != newNode)
{
newNode->data = value;
newNode->next = 0;
node->next = newNode;
}
Ricompilare il progetto Annotations.
Il progetto verrà compilato senza alcun avviso o errore.
Per utilizzare l'annotazione del codice sorgente
Annotare i parametri formali e il valore restituito della funzione AddTail utilizzando le condizioni Pre e Post, come illustrato nell'esempio seguente:
[returnvalue:SA_Post (Null=SA_Maybe)] LinkedList* AddTail
(
[SA_Pre(Null=SA_Maybe)] LinkedList* node,
int value
)
Ricompilare il progetto Annotations.
Nella finestra Elenco errori fare doppio clic sul seguente avviso:
avviso C6011: Dereferenziazione del puntatore NULL 'node'.
Questo avviso indica che il nodo passato alla funzione potrebbe essere null e indica il numero di riga dove è stato generato l'avviso.
Per risolvere il problema, utilizzare un'istruzione 'if' per verificare il valore restituito.L'aspetto del codice dovrebbe essere simile al seguente:
. . . LinkedList *newNode = NULL; if (NULL == node) { return NULL; . . . }
Ricompilare il progetto Annotations.
Il progetto verrà compilato senza alcun avviso o errore.
Vedere anche
Attività
Procedura dettagliata: analisi del codice gestito per l'identificazione di errori del codice