Condividi tramite


Analizzare la qualità del codice C++ nelle app dello Store con l'analisi statica del codice di Visual Studio

Si applica a Windows e Windows Phone

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

C++ code analysis warnings

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:

  1. In Esplora soluzioni scegli il nome del progetto, quindi scegli Proprietà.

  2. 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.

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.

Avviso analisi codice espanso

Quando espandi un avviso, le righe di codice che hanno provocato l'avviso sono evidenziate nell'editor di codice di Visual Studio.

Codice sorgente evidenziato

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:

  1. Se le informazioni dettagliate non sono visualizzate, espandi il titolo dell'avviso.

  2. Scegli il link Azioni nella parte inferiore dell'avviso.

  3. 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.

Finestra Cerca e filtra analisi codice

Avvisi di analisi del codice C++

L'analisi del codice genera gli avvisi seguenti per il codice C++:

Regola

Descrizione

C6001

Utilizzo di memoria non inizializzata

C6011

Dereferenziazione del puntatore Null

C6029

Utilizzo del valore non verificato

C6053

Terminazione zero da chiamata

C6059

Concatenazione non valida

C6063

Argomento stringa mancante per formattare la funzione

C6064

Argomento Integer mancante per formattare la funzione

C6066

Argomento puntatore mancante per formattare la funzione

C6067

Argomento puntatore stringa mancante per formattare la funzione

C6101

Restituzione di memoria non inizializzata

C6200

L'indice supera il limite massimo del buffer

C6201

L'indice supera il limite massimo del buffer di stack

C6270

Argomento Float mancante per formattare la funzione

C6271

Argomento aggiuntivo per formattare la funzione

C6272

Argomento non Float per formattare la funzione

C6273

Argomento non Integer per formattare la funzione

C6274

Argomento non Character per formattare la funzione

C6276

Cast stringa non valido

C6277

Chiamata CreateProcess non valida

C6284

Argomento di oggetto non valido per formattare la funzione

C6290

Precedenza Logical-Not Bitwise-And

C6291

Precedenza Logical-Not Bitwise-Or

C6302

Argomento stringa di caratteri non valido per formattare la funzione

C6303

Argomento stringa di caratteri wide non valido per formattare la funzione

C6305

Uso dimensione e conteggio non corrispondente

C6306

Chiamata di funzione dell'argomento variabile non corretto

C6328

Tipo argomento potenzialmente non corrispondente

C6385

Overrun di lettura

C6386

Overrun di scrittura

C6387

Valore parametro non valido

C6500

Proprietà attributo non valido

C6501

Conflitto valori di proprietà attributo

C6503

I riferimenti non possono essere Null

C6504

Null su non puntatore

C6505

MustCheck su nullo

C6506

Dimensioni buffer su non puntatore o matrice

C6507

Errata corrispondenza null al livello di dereferenziazione zero

C6508

Accesso in scrittura a costante

C6509

Restituzione utilizzati in precondizione

C6510

Null terminato su non puntatore

C6511

MustCheck deve essere Yes o No

C6513

Dimensioni elemento senza dimensione buffer

C6514

Le dimensioni del buffer superano le dimensioni della matrice

C6515

Dimensioni buffer su non puntatore

C6516

Nessuna proprietà su attributo

C6517

Dimensioni valide su buffer non leggibile

C6518

Dimensioni scrivibili su buffer non scrivibile

C6519

Annotazione non valida: il valore della proprietà 'NeedsRelease' deve essere Yes o No

C6521

Deferenziazione stringa dimensioni non valida

C6522

Tipo stringa dimensioni non valida

C6523

Parametro stringa dimensioni non valido

C6525

Percorso irraggiungibile stringa dimensioni non valida

C6526

Tipo buffer stringa dimensioni non valido

C6527

Annotazione non valida: la proprietà 'NeedsRelease' non può essere utilizzata con valori di tipo void

C6530

Stile stringa formato non riconosciuto

C6540

L'utilizzo delle annotazioni di attributo in questa funzione invalida tutte le relative annotazioni __declspec

C6551

Specifica di dimensione non valida: espressione non analizzabile

C6552

Deref= o Notref= non valido: espressione non analizzabile

C6701

Il valore non è un valore Yes/No/Maybe valido

C6702

Il valore non è un valore stringa

C6703

Il valore non è un numero

C6704

Errore imprevisto dell'espressione dell'annotazione

C6705

Numero previsto di argomenti per l'annotazione non corrispondente al numero effettivo di argomenti per l'annotazione

C6706

Errore di annotazione imprevisto per l'annotazione

C28021

Il parametro annotato deve essere un puntatore

C28182

Deferenziazione del puntatore NULL. Il puntatore contiene lo stesso valore NULL contenuto in un altro puntatore.

C28202

Riferimento non valido a membro non statico

C28203

Riferimento ambiguo al membro di classe.

C28205

_Success_ o _On_failure_ utilizzato in un contesto non valido

C28206

L'operando sinistro punta a uno struct. Utilizzare '->'

C28207

L'operando sinistro è uno struct. Utilizzare '.'

C28210

Impossibile definire le annotazioni per il contesto __On_failure in un precontesto esplicito

C28211

Previsto nome contesto statico per SAL_context

C28212

Prevista espressione del puntatore per l'annotazione

C28213

L'annotazione _Use_decl_annotations_ deve essere utilizzata per fare riferimento, senza alcuna modifica, a una dichiarazione precedente.

C28214

I nomi di parametro di attributo devono essere p1...p9

C28215

Impossibile applicare typefix a un parametro che già dispone di un typefix

C28216

L'annotazione checkReturn si applica soltanto a postcondizioni per il parametro di funzione specifico.

C28217

Per la funzione, il numero di parametri per l'annotazione non corrisponde a quello trovato nel file

C28218

Per il parametro della funzione, nell'annotazione, il numero di parametri dell'annotazione non corrisponde a quello trovato nel file

C28219

Membro di enumerazione previsto per l'annotazione del parametro nell'annotazione

C28220

Espressione integer prevista per l'annotazione del parametro nell'annotazione

C28221

Prevista espressione di tipo String per il parametro nell'annotazione

C28222

Previsto __yes, __no o __maybe per l'annotazione

C28223

Token o identificatore previsto mancante per l'annotazione, parametro

C28224

L'annotazione richiede parametri

C28225

Numero non corretto di parametri necessari nell'annotazione

C28226

L'annotazione non può essere anche PrimOp nella dichiarazione corrente

C28227

L'annotazione non può essere anche PrimOp nella dichiarazione precedente

C28228

Parametro di annotazione: Impossibile utilizzare il tipo nelle annotazioni

C28229

L'annotazione non supporta parametri

C28230

Il tipo di parametro non ha membro.

C28231

L'annotazione è valida solo in una matrice

C28232

Pre, post o deref non applicato ad alcuna annotazione

C28233

Pre, post o deref applicato a un blocco

C28234

L'espressione __At non si applica alla funzione corrente

C28235

La funzione non può fungere autonomamente da annotazione

C28236

Impossibile utilizzare l'annotazione in un'espressione

C28237

L'annotazione nel parametro non è più supportata

C28238

L'annotazione nel parametro presenta più di un valore, stringValue e longValue. Utilizzare paramn=xxx

C28239

L'annotazione nel parametro presenta sia stringValue, o longValue, che paramn=xxx. Utilizzare solo paramn=xxx

C28240

L'annotazione nel parametro presenta param2 ma nessun param1

C28241

Annotazione per la funzione nel parametro non riconosciuta

C28243

L'annotazione per la funzione nel parametro richiede più dereferenziazioni di quante ne siano consentite dal tipo annotato effettivo

C28245

L'annotazione per la funzione annota 'this' in una funzione non membro

C28246

Nell'annotazione per la funzione, il parametro non corrisponde al tipo del parametro

C28250

Annotazione incoerente per la funzione: errore dell'istanza precedente.

C28251

Annotazione incoerente per la funzione: errore dell'istanza.

C28252

Annotazione incoerente per la funzione: il parametro presenta altre annotazioni su questa istanza.

C28253

Annotazione incoerente per la funzione: il parametro presenta altre annotazioni su questa istanza.

C28254

dynamic_cast<>() non è supportato nelle annotazioni

C28262

Errore di sintassi dell'annotazione rilevato nella funzione per l'annotazione

C28263

Errore di sintassi nell'annotazione condizionale rilevato nell'oggetto annotazione intrinseco

C28264

I valori degli elenchi di risultati devono essere costanti.

C28267

Errore di sintassi dell'annotazione rilevato nella funzione per l'annotazione.

C28272

L'annotazione per la funzione, parametro, durante l'analisi non è coerente con la dichiarazione della funzione

C28273

Per la funzione, le informazioni non sono coerenti con la dichiarazione della funzione

C28275

Il parametro per _Macro_value_ è null

C28279

Per il simbolo è stato trovato un 'begin' senza il corrispondente 'end'

C28280

Per il simbolo, è stato trovato un 'end' senza un 'begin' corrispondente

C28282

Le stringhe di formato devono essere nelle precondizioni

C28285

Per la funzione, errore di sintassi nel parametro

C28286

Per la funzione, errore di sintassi vicino alla fine

C28287

Per la funzione, errore di sintassi nell'annotazione _At_() (nome parametro non riconosciuto)

C28288

Per la funzione, errore di sintassi nell'annotazione _At_() (nome parametro non valido)

C28289

Per la funzione: ReadableTo o WritableTo non disponeva di limit-spec come parametro

C28290

L'annotazione per la funzione contiene un numero di riferimenti esterni maggiore del numero di parametri effettivi

C28291

Il post null/notnull al livello deref 0 è privo di significato per la funzione.

C28300

Operandi dell'espressione di tipi incompatibili per l'operatore

C28301

Nessuna annotazione per la prima dichiarazione di funzione.

C28302

Operatore _Deref_ aggiuntivo rilevato nell'annotazione.

C28303

Operatore _Deref_ ambiguo trovato nell'annotazione.

C28304

Operatore _Notref_ non correttamente posizionato applicato al token.

C28305

È stato individuato un errore durante l'analisi di un token.

C28350

L'annotazione descrive una situazione non applicabile in modo condizionale.

C28351

L'annotazione descrive la posizione nella condizione in cui non è possibile utilizzare un valore dinamico (variabile).