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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per