Advertencia C28220

Expresión entera esperada para la anotación "annotation"

Esta advertencia indica que se esperaba una expresión entera como parámetro de anotación, pero en su lugar se usó un tipo incompatible. Puede deberse a que intenta usar una macro de anotación SAL que no se ajusta al escenario actual.

Ejemplo

#include <sal.h>

// Oops, the _In_reads_ annotation takes an integer type but is being passed a pointer
void f(_In_reads_(last) const int *buffer, const int *last)
{
  for(; buffer < last; ++buffer)
  {
    //...
  }
}

En este ejemplo, la intención del desarrollador era indicar que buffer se leería hasta el last elemento . La _In_reads_ anotación no corrige el escenario porque se usa para indicar un tamaño de búfer en el número de elementos. La anotación correcta es _In_reads_to_ptr_, que indica el final del búfer con un puntero.

Si no hubiera ningún equivalente de _to_ptr_ a la anotación usada, la advertencia podría haberse solucionado convirtiendo el puntero last en un valor de tamaño con (buffer - size) en la anotación.

#include <sal.h>

void f(_In_reads_to_ptr_(last) const int *buffer, const int *last)
{
  for(; buffer < last; ++buffer)
  {
    //...
  }
}