Condividi tramite


Avviso C28213

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

Osservazioni:

_Use_decl_annotations_ indica al compilatore di usare le annotazioni di una dichiarazione precedente della funzione. Se non riesce a trovare una dichiarazione precedente o se la dichiarazione corrente apporta modifiche alle annotazioni, genera questo avviso. _Use_decl_annotations_ consente inoltre di rimuovere tutte le altre annotazioni dalla definizione e di usare le annotazioni di dichiarazione per l'analisi della funzione.

Questa diagnostica è spesso un effetto collaterale del refactoring o della correzione di altri avvisi modificando le annotazioni in una funzione. Per risolvere il problema, usare le stesse annotazioni nelle altre posizioni. Per determinare il set corretto di annotazioni, esaminare il comportamento nella definizione della funzione. Nella maggior parte dei casi, questo comportamento è intenzionale e le annotazioni alla funzione devono rifletterlo. Per altre informazioni sulle annotazioni SAL, vedere Uso delle annotazioni SAL per ridurre i difetti del codice.

È importante che le annotazioni corrispondano tra le dichiarazioni e la definizione di una funzione. Quando gli strumenti di analisi analizzano il sito di chiamata della funzione, usano le annotazioni di dichiarazione. Se la dichiarazione e la definizione non corrispondono, gli strumenti di analisi statici potrebbero produrre risultati non corretti. Quando si corregge questo avviso, è comune che le modifiche abbiano effetti a catena perché lo strumento rianalizza l'origine con informazioni aggiornate.

Se questa diagnostica si verifica perché l'analizzatore non è riuscito a trovare una dichiarazione precedente nell'unità di conversione, la causa più probabile è una direttiva mancante #include . Per risolvere questo problema quando non si include intenzionalmente il file di intestazione, verificare che le annotazioni nella dichiarazione e nella definizione corrispondano e rimuovere l'annotazione _Use_decl_annotations_ . Prestare attenzione quando non si include un file di intestazione, perché i due set di annotazioni potrebbero non essere sincronizzati in futuro.

Nome dell'analisi del codice: BAD_USEHEADER

Esempi

Il codice seguente genera l'errore C28160. L'annotazione buffer del parametro non corrisponde tra i due file.

Da example.h:

void addNullTerminate(_Out_writes_(n) char* buffer, int n);

Da example.cpp:

_Use_decl_annotations_
void addNullTerminate(_Out_writes_z_(n) char* buffer, int n)
{
    buffer[n] = '\0';
}

Esaminare la definizione della funzione per determinare quali annotazioni corrette devono essere. In questo caso, _Out_writes_z_(n) sembra essere corretto, quindi l'annotazione viene spostata nella dichiarazione di funzione nel file di intestazione. Questa modifica risolve il problema perché le annotazioni nella dichiarazione e nella definizione corrispondono ora.

Da example.h:

void addNullTerminate(_Out_writes_z_(n) char* buffer, int n);

È ora possibile rimuovere l'annotazione del buffer nella definizione per semplificare la manutenzione futura (anche se questo passaggio è facoltativo).

Da example.cpp:

_Use_decl_annotations_
void addNullTerminate(char* buffer, int n)
{
    buffer[n] = '\0';
}

Nel codice reale, in genere non è chiaro quale annotazione è corretta. Per altre informazioni e indicazioni, vedere Uso delle annotazioni SAL per ridurre i difetti del codice.

Vedi anche

Set di regole per il codice C++
Uso delle annotazioni SAL per ridurre i difetti del codice
C28252
C28253
C28301