Analizzare la qualità del codice C++ nelle app dello Store con l'analisi statica del codice di Visual Studio
Lo strumento di analisi del codice disponibile nelle edizioni di Visual Studio Express esamina il codice alla ricerca di un set di errori comuni e di violazioni delle procedure di programmazione ottimali. Gli avvisi di analisi del codice sono diversi rispetto agli errori e agli avvisi del compilatore in quanto durante l'analisi del codice vengono cercati modelli di codice specifici che risultano validi ma che potrebbero causare problemi a te o ad altre persone che usano 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, Visual Studio Premium e Visual Studio Professional puoi usare le funzionalità complete degli strumenti 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
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:
In Esplora soluzioni scegli il nome del progetto, quindi scegli Proprietà.
Nella pagina delle proprietà del progetto, scegli Analisi codice, quindi Attiva analisi codice per C/C++ in fase di compilazione.
La soluzione viene compilata 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, scegli il titolo dell'avviso nella finestra Analisi codice. L'avviso si espande per visualizzare le informazioni dettagliate sul problema. Quando possibile, l'analisi del codice mostra il numero di riga e la logica dell'analisi che ha portato all'avviso.
Quando espandi un avviso, le righe di codice che hanno provocato l'avviso sono evidenziate nell'editor di codice di Visual Studio.
Dopo aver compreso il problema, puoi 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 generi nuovi avvisi.
Suggerimento
Puoi rieseguire l'analisi del codice dalla finestra Analisi codice.Scegli il pulsante Analizza, quindi scegli 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 e quindi scegli In origine.
L'eliminazione di un messaggio comporta l'inserimento di #pragma(warning:IdAvviso) che consente di eliminare 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 |
|
Argomento aggiuntivo per formattare la 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 |
|
Uso 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 |
|
Errata corrispondenza null al livello di dereferenziazione zero |
|
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 |
|
Deferenziazione stringa dimensioni non valida |
|
Tipo stringa dimensioni non valida |
|
Parametro stringa dimensioni non valido |
|
Percorso irraggiungibile stringa dimensioni non valida |
|
Tipo buffer stringa dimensioni non valido |
|
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 |
|
Numero previsto di argomenti per l'annotazione non corrispondente al numero effettivo di argomenti per l'annotazione |
|
Errore di annotazione imprevisto per l'annotazione |
|
Il parametro annotato deve essere un puntatore |
|
Deferenziazione del puntatore NULL. Il puntatore contiene lo stesso valore NULL contenuto in un altro puntatore. |
|
Riferimento non valido a membro non statico |
|
Riferimento ambiguo al 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 '.' |
|
Impossibile definire le annotazioni per il contesto __On_failure in un precontesto 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 di parametro di attributo devono essere p1...p9 |
|
Impossibile applicare typefix a un parametro che già dispone di un typefix |
|
L'annotazione checkReturn si applica soltanto a postcondizioni per il parametro di funzione specifico. |
|
Per la funzione, il numero di parametri per l'annotazione non corrisponde a quello trovato nel file |
|
Per il parametro della funzione, nell'annotazione, il numero di parametri dell'annotazione non corrisponde a quello trovato nel file |
|
Membro di enumerazione previsto per l'annotazione del parametro nell'annotazione |
|
Espressione integer prevista 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 o identificatore previsto mancante per l'annotazione, parametro |
|
L'annotazione richiede parametri |
|
Numero non corretto di parametri necessari 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 |
|
Impossibile utilizzare l'annotazione 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 |
|
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 |
|
Nell'annotazione per la funzione, il parametro non corrisponde al tipo del parametro |
|
Annotazione incoerente per la funzione: errore dell'istanza precedente. |
|
Annotazione incoerente per la funzione: errore dell'istanza. |
|
Annotazione incoerente per la funzione: il parametro presenta altre annotazioni su questa istanza. |
|
Annotazione incoerente per la funzione: il parametro presenta altre annotazioni su 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 annotazione intrinseco |
|
I valori degli elenchi di risultati devono essere costanti. |
|
Errore di sintassi dell'annotazione rilevato nella funzione per l'annotazione. |
|
L'annotazione per la funzione, parametro, durante l'analisi non è coerente con la dichiarazione della funzione |
|
Per la funzione, le informazioni 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 vicino alla 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 di un token. |
|
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). |