Advertencia C28213

La _Use_decl_annotations_ anotación debe usarse para hacer referencia, sin modificaciones, a una declaración anterior.

Comentarios

_Use_decl_annotations_ indica al compilador que use las anotaciones de una declaración anterior de la función. Si no encuentra una declaración anterior o si la declaración actual realiza cambios en las anotaciones, emite esta advertencia. _Use_decl_annotations_ también permite quitar todas las demás anotaciones de la definición y usa las anotaciones de declaración para el análisis de la función.

Este diagnóstico suele ser un efecto secundario de la refactorización o la corrección de otras advertencias mediante el ajuste de las anotaciones en una función. Para corregir el problema, use las mismas anotaciones en las otras ubicaciones. Para determinar el conjunto correcto de anotaciones, examine el comportamiento en la definición de función. En la mayoría de los casos, este comportamiento es intencionado y las anotaciones de la función deben reflejarlo. Para obtener más información sobre las anotaciones SAL, consulte Uso de anotaciones SAL para reducir los defectos de código.

Es importante que las anotaciones coincidan entre las declaraciones y la definición de una función. Cuando las herramientas de análisis analizan el sitio de llamada de la función, usan las anotaciones de declaración. Si la declaración y la definición no coinciden, las herramientas de análisis estático pueden generar resultados incorrectos. Al corregir esta advertencia, es habitual que los cambios tengan efectos en cascada, ya que la herramienta vuelve a analizar el origen con información actualizada.

Si se produce este diagnóstico porque el analizador no pudo encontrar una declaración anterior en la unidad de traducción, la causa más probable es una directiva que falta #include . Para resolver este problema cuando no incluya intencionadamente el archivo de encabezado, compruebe que las anotaciones de la declaración y la definición coinciden y quite la _Use_decl_annotations_ anotación. Tenga cuidado cuando no incluya un archivo de encabezado, ya que los dos conjuntos de anotaciones pueden salir de la sincronización en el futuro.

Nombre del análisis de código: BAD_USEHEADER

Ejemplos

El código siguiente genera la advertencia C28160. La buffer anotación del parámetro no coincide entre los dos archivos.

En example.h:

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

En example.cpp:

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

Examine la definición de función para determinar cuáles deben ser las anotaciones correctas. En este caso, _Out_writes_z_(n) parece ser correcto, por lo que movemos esa anotación a la declaración de función en el archivo de encabezado. Este cambio resuelve el problema porque las anotaciones de la declaración y la definición coinciden ahora.

En example.h:

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

Ahora podemos quitar la anotación del búfer en la definición para simplificar el mantenimiento futuro (aunque este paso es opcional).

En example.cpp:

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

En el código del mundo real, no suele ser tan claro qué anotación es correcta. Para obtener más información e instrucciones, consulte Uso de anotaciones SAL para reducir los defectos de código.

Consulte también

Conjuntos de reglas para código de C++
Uso de anotaciones SAL para reducir los defectos en el código
C28252
C28253
C28301