Analisi della qualità del codice C++ delle app di Windows Store con analisi del codice di Visual Studio
Lo strumento di analisi del codice disponibile in Microsoft Visual Studio Express 2012 per Windows 8 esamina il codice alla ricerca di un set di problemi comuni e di violazioni delle procedure di programmazione ottimali. Gli avvisi di analisi del codice sono diversi rispetto agli errori e avvisi del compilatore. Lo strumento di analisi del codice cerca infatti modelli di codice specifici che risultano validi ma che potrebbero causare problemi a te o ad altre persone che utilizzano il codice. L'analisi del codice può inoltre trovare difetti all'interno del codice che di solito sono difficili da individuare tramite l'esecuzione di test. L'esecuzione dello strumento di analisi del codice a intervalli regolari durante il processo di sviluppo può migliorare la qualità dell'app completata.
Nota
In Visual Studio Ultimate 2012, Visual Studio Premium 2012 e Visual Studio Professional 2012 puoi utilizzare la funzionalità di analisi del codice. Vedi Analisi della qualità dell'applicazione tramite gli strumenti di analisi del codice in MSDN Library.
In questo argomento
Puoi acquisire informazioni su:
Esecuzione dell'analisi del codice
Analizzare e risolvere gli avvisi di analisi del codice
Eliminazione degli avvisi di analisi del codice
Ricerca e filtro dei risultati dell'analisi del codice
Avvisi di analisi del codice C++
Esecuzione dell'analisi del codice
Per eseguire l'analisi del codice nella soluzione di Visual Studio:
- Scegli Esegui Analisi del codice su soluzione dal menu Genera.
Per eseguire automaticamente l'analisi codice ogni volta che compili un progetto:
Scegli il nome del progetto in Esplora soluzioni, quindi scegli Proprietà.
Nella pagina delle proprietà del progetto, scegli Analisi codice, quindi Attiva analisi del codice per C/C++ in fase di compilazione.
La soluzione viene compilate e viene eseguita l'analisi del codice. I risultati vengono visualizzati nella finestra Analisi codice.
Analizzare e risolvere gli avvisi di analisi del codice
Per analizzare un avviso specifico, seleziona il titolo dell'avviso nella finestra Analisi codice. L'avviso si espande per visualizzare le informazioni dettagliate sul problema. Se possibile, l'analisi del codice visualizza il numero di riga e logica di analisi che ha causato l'avviso.
Quando espandi un avviso, le righe di codice che hanno provocato l'avviso vengono evidenziate nell'editor di codice di Visual Studio.
Dopo aver compreso il problema, potrai risolverlo nel codice. Riesegui quindi l'analisi del codice per verificare che l'avviso non venga più visualizzato nella finestra Analisi codice e che la correzione non generare nuovi avvisi.
Suggerimento
Puoi rieseguire l'analisi del codice dalla finestra Analisi codice. Scegli il pulsante Analizza, quindi l'ambito dell'analisi. Puoi rieseguire l'analisi dell'intera soluzione o di un progetto selezionato.
Eliminazione degli avvisi di analisi del codice
In alcuni casi potresti decidere di non correggere un avviso di analisi del codice. Puoi decidere che risolvere il problema richiede un'eccessiva ricodificazione relativamente alla probabilità che il problema si ripresenti in qualsiasi implementazione realistica del codice. Oppure potresti ritenere che l'analisi utilizzata nell'avviso sia inadeguata per il contesto specifico. Puoi eliminare gli avvisi in modo che non vengano più visualizzati nella finestra Analisi codice.
Per eliminare un avviso:
Se le informazioni dettagliate non sono visualizzate, espandi il titolo dell'avviso.
Scegli il link Azioni nella parte inferiore dell'avviso.
Scegli Elimina messaggio, quindi In origine.
L'eliminazione di un messaggio composta l'inserimento di #pragma(warning:WarningId) che elimina l'avviso per la riga di codice.
Ricerca e filtro dei risultati dell'analisi del codice
Puoi effettuare una ricerca in lunghi elenchi di messaggi di avviso e filtrare gli avvisi nelle soluzioni composte da più progetti.
Avvisi di analisi del codice C++
L'analisi del codice genera gli avvisi seguenti per il codice C++:
Regola |
Descrizione |
---|---|
Utilizzo di memoria non inizializzata |
|
Dereferenziazione del puntatore NULL |
|
Utilizzo del valore non verificato |
|
Terminazione zero da chiamata |
|
Concatenazione non valida |
|
Argomento stringa mancante per formattare la funzione |
|
Argomento Integer mancante per formattare la funzione |
|
Argomento puntatore mancante per formattare la funzione |
|
Argomento puntatore stringa mancante per formattare la funzione |
|
Restituzione di memoria non inizializzata |
|
L'indice supera il limite massimo del buffer |
|
L'indice supera il limite massimo del buffer di stack |
|
Argomento Float mancante per formattare la funzione |
|
L'argomento aggiuntivo per formattare funzione |
|
Argomento non Float per formattare la funzione |
|
Argomento non Integer per formattare la funzione |
|
Argomento non Character per formattare la funzione |
|
Cast stringa non valido |
|
Chiamata CreateProcess non valida |
|
Argomento di oggetto non valido per formattare la funzione |
|
Precedenza Logical-Not Bitwise-And |
|
Precedenza Logical-Not Bitwise-Or |
|
Argomento stringa di caratteri non valido per formattare la funzione |
|
Argomento stringa di caratteri wide non valido per formattare la funzione |
|
Utilizzo dimensione e conteggio non corrispondente |
|
Chiamata di funzione dell'argomento variabile non corretto |
|
Tipo argomento potenzialmente non corrispondente |
|
Overrun di lettura |
|
Overrun di scrittura |
|
Valore parametro non valido |
|
Proprietà attributo non valido |
|
Conflitto valori di proprietà attributo |
|
I riferimenti non possono essere Null. |
|
Null su non puntatore |
|
MustCheck su nullo |
|
Dimensioni buffer su non puntatore o matrice |
|
Null non corrispondente a zero dereferenziazione |
|
Accesso in scrittura a costante |
|
Restituzione utilizzati in precondizione |
|
Null terminato su non puntatore |
|
MustCheck deve essere Yes o No |
|
Dimensioni elemento senza dimensione buffer |
|
Le dimensioni del buffer superano le dimensioni della matrice |
|
Dimensioni buffer su non puntatore |
|
Nessuna proprietà su attributo |
|
Dimensioni valide su buffer non leggibile |
|
Dimensioni scrivibili su buffer non scrivibile |
|
Annotazione non valida: il valore della proprietà 'NeedsRelease' deve essere Yes o No. |
|
Dereferenziazione stringa dimensioni non valida |
|
Tipo stringa dimensioni non valida |
|
Parametro stringa dimensioni non valida |
|
Percorso irraggiungibile stringa dimensioni non valida |
|
Tipo di buffer stringa dimensioni non valida |
|
Annotazione non valida: la proprietà 'NeedsRelease' non può essere utilizzata con valori di tipo void. |
|
Stile stringa formato non riconosciuto |
|
L'utilizzo delle annotazioni di attributo in questa funzione invalida tutte le relative annotazioni __declspec |
|
Specifica di dimensione non valida: espressione non analizzabile |
|
Deref= o Notref= non valido: espressione non analizzabile |
|
Il valore non è un valore Yes/No/Maybe valido |
|
Il valore non è un valore stringa |
|
Il valore non è un numero |
|
Errore imprevisto dell'espressione dell'annotazione |
|
Il numero di argomenti previsto per l'annotazione non corrisponde al numero di argomenti effettivo per l'annotazione |
|
Errore di annotazione imprevisto per l'annotazione |
|
Il parametro annotato deve essere un puntatore |
|
Dereferenziazione del puntatore NULL Il puntatore contiene lo stesso valore NULL di un altro puntatore. |
|
Riferimento non valido a membro non statico |
|
Riferimento ambiguo a membro di classe |
|
_Success_ o _On_failure_ utilizzato in un contesto non valido |
|
L'operando sinistro punta a uno struct. Utilizzare '->'. |
|
L'operando sinistro è uno struct. Utilizzare '.' |
|
Le annotazioni per il contesto __on_failure non devono trovarsi in pre-contesto esplicito |
|
Previsto nome contesto statico per SAL_context |
|
Prevista espressione del puntatore per l'annotazione |
|
L'annotazione _Use_decl_annotations_ deve essere utilizzata per fare riferimento, senza alcuna modifica, a una dichiarazione precedente. |
|
I nomi dei parametri degli attributi devono essere p1...p9 |
|
Impossibile applicare typefix a un parametro che già dispone di un typefix |
|
L'annotazione checkReturn si applica solo a postcondizioni per il parametro di funzione specifico. |
|
Per la funzione, il numero dei parametri per l'annotazione non corrisponde a quello trovato nel file |
|
Per il parametro di funzioni, il parametro dell'annotazione non corrisponde a quello trovato nel file |
|
Membro di enumerazione previsto per l'annotazione del parametro nell'annotazione |
|
Prevista espressione di tipo Integer per l'annotazione del parametro nell'annotazione |
|
Prevista espressione di tipo String per il parametro nell'annotazione |
|
Previsto __yes, __no o __maybe per l'annotazione |
|
Token/identificatore previsto per l'annotazione, parametro |
|
L'annotazione richiede parametri |
|
Impossibile trovare il numero corretto di parametri obbligatori nell'annotazione |
|
L'annotazione non può essere anche PrimOp nella dichiarazione corrente |
|
L'annotazione non può essere anche PrimOp nella dichiarazione precedente |
|
Parametro di annotazione: impossibile utilizzare il tipo nelle annotazioni |
|
L'annotazione non supporta parametri |
|
Il tipo di parametro non ha membro |
|
L'annotazione è valida solo in una matrice |
|
pre, post o deref non applicato ad alcuna annotazione |
|
pre, post o deref applicato a un blocco |
|
L'espressione __at non si applica alla funzione corrente |
|
La funzione non può fungere autonomamente da annotazione |
|
L'annotazione non può essere utilizzata in un'espressione |
|
L'annotazione nel parametro non è più supportata |
|
L'annotazione nel parametro presenta più di un valore, stringValue e longValue. Utilizzare paramn=xxx |
|
L'annotazione nel parametro presenta sia stringValue, o longValue, che paramn=xxx. Utilizzare solo paramn=xxx |
|
L'annotazione nel parametro presenta param2 ma nessun param1 |
|
L'annotazione per la funzione nel parametro non è riconosciuta |
|
L'annotazione per la funzione nel parametro richiede più dereferenziazioni di quante ne siano consentite dal tipo annotato effettivo |
|
L'annotazione per la funzione annota 'this' in una funzione non membro |
|
L'annotazione del parametro per la funzione non corrisponde al tipo del parametro |
|
Annotazione incoerente per la funzione: errore dell'istanza precedente |
|
Annotazione incoerente per la funzione: errore dell'istanza |
|
Annotazione non coerente per la funzione: il parametro include altre annotazioni in questa istanza. |
|
Annotazione non coerente per la funzione: il parametro include altre annotazioni in questa istanza. |
|
dynamic_cast<>() non è supportato nelle annotazioni |
|
Errore di sintassi dell'annotazione rilevato nella funzione per l'annotazione |
|
Errore di sintassi nell'annotazione condizionale rilevato nell'oggetto intrinseco |
|
I valori dell'elenco dei risultati devono essere costanti. |
|
Errore di sintassi nelle annotazioni rilevato nella funzione per l'annotazione |
|
L'annotazione per la funzione, parametro, durante l'analisi non è coerente con la dichiarazione della funzione |
|
Gli indizi per la funzione non sono coerenti con la dichiarazione della funzione |
|
Il parametro per _Macro_value_ è null |
|
Per il simbolo è stato trovato un 'begin' senza il corrispondente 'end' |
|
Per il simbolo, è stato trovato un 'end' senza un 'begin' corrispondente |
|
Le stringhe di formato devono essere nelle precondizioni |
|
Per la funzione, errore di sintassi nel parametro |
|
Per la funzione, errore di sintassi nei pressi della fine |
|
Per la funzione, errore di sintassi nell'annotazione _At_() (nome parametro non riconosciuto) |
|
Per la funzione, errore di sintassi nell'annotazione _At_() (nome parametro non valido) |
|
Per la funzione: ReadableTo o WritableTo non disponeva di limit-spec come parametro |
|
L'annotazione per la funzione contiene un numero di riferimenti esterni maggiore del numero di parametri effettivi |
|
Il post null/notnull al livello deref 0 è privo di significato per la funzione. |
|
Operandi dell'espressione di tipi incompatibili per l'operatore |
|
Nessuna annotazione per la prima dichiarazione di funzione. |
|
Operatore _Deref_ aggiuntivo rilevato nell'annotazione. |
|
Operatore _Deref_ ambiguo trovato nell'annotazione. |
|
Operatore _Notref_ non correttamente posizionato applicato al token. |
|
È stato individuato un errore durante l'analisi |
|
L'annotazione descrive una situazione non applicabile in modo condizionale. |
|
L'annotazione descrive la posizione nella condizione in cui non è possibile utilizzare un valore dinamico (variabile). |