Avertissement C28213

L’annotation _Use_decl_annotations_ doit être utilisée pour référencer, sans modification, une déclaration préalable.

Notes

_Use_decl_annotations_ indique au compilateur d’utiliser les annotations d’une déclaration antérieure de la fonction. S’il ne trouve pas de déclaration antérieure ou si la déclaration actuelle apporte des modifications aux annotations, elle émet cet avertissement. _Use_decl_annotations_ vous permet également de supprimer toutes les autres annotations de la définition et d’utiliser les annotations de déclaration pour l’analyse de la fonction.

Ce diagnostic est souvent un effet secondaire de la refactorisation ou de la correction d’autres avertissements en ajustant les annotations sur une fonction. Pour résoudre le problème, utilisez les mêmes annotations aux autres emplacements. Pour déterminer l’ensemble correct d’annotations, examinez le comportement dans la définition de fonction. Dans la plupart des cas, ce comportement est intentionnel et les annotations de la fonction doivent la refléter. Pour plus d’informations sur les annotations SAL, consultez Utilisation des annotations SAL pour réduire les défauts de code.

Il est important que les annotations correspondent entre les déclarations et la définition d’une fonction. Lorsque les outils d’analyse analysent le site d’appel de la fonction, ils utilisent les annotations de déclaration. Si la déclaration et la définition ne correspondent pas, les outils d’analyse statique peuvent produire des résultats incorrects. Lorsque vous corrigez cet avertissement, il est courant que vos modifications aient des effets en cascade lorsque l’outil réanalyse la source avec des informations mises à jour.

Si ce diagnostic se produit parce que l’analyseur n’a pas trouvé de déclaration précédente dans l’unité de traduction, la cause la plus probable est une directive manquante #include . Pour résoudre ce problème lorsque vous n’incluez pas intentionnellement le fichier d’en-tête, vérifiez que les annotations dans la déclaration et la définition correspondent, puis supprimez l’annotation _Use_decl_annotations_ . Soyez prudent lorsque vous n’incluez pas de fichier d’en-tête, car les deux ensembles d’annotations peuvent sortir de la synchronisation à l’avenir.

Nom de l’analyse du code : BAD_USEHEADER

Exemples

Le code suivant génère l’erreur C28160. L’annotation de buffer paramètre ne correspond pas entre les deux fichiers.

À partir de example.h :

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

À partir de example.cpp :

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

Examinez la définition de fonction pour déterminer les annotations appropriées. Dans ce cas, _Out_writes_z_(n) il semble être correct. Nous allons donc déplacer cette annotation vers la déclaration de fonction dans le fichier d’en-tête. Cette modification résout le problème, car les annotations dans la déclaration et la définition correspondent maintenant.

À partir de example.h :

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

Nous pouvons maintenant supprimer l’annotation de mémoire tampon sur la définition pour simplifier la maintenance future (bien que cette étape soit facultative).

À partir de example.cpp :

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

Dans le code réel, il n’est généralement pas aussi clair quelle annotation est correcte. Pour plus d’informations et de conseils, consultez l’utilisation d’annotations SAL pour réduire les défauts de code.

Voir aussi

Ensembles de règles pour le code C++
Utilisation des annotations SAL pour réduire les défauts de code
C28252
C28253
C28301