Avertissement C28220

Expression entière attendue pour l’annotation 'annotation'

Cet avertissement indique qu’une expression entière était attendue comme paramètre d’annotation, mais qu’un type incompatible a été utilisé à la place. Cela peut être dû à une tentative d’utilisation d’une macro d’annotation SAL qui ne correspond pas au scénario actuel.

Exemple

#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)
  {
    //...
  }
}

Dans cet exemple, l’intention du développeur était d’indiquer qu’elle buffer serait lue jusqu’à l’élément last . L’annotation _In_reads_ ne résout pas le scénario, car elle est utilisée pour indiquer une taille de mémoire tampon en nombre d’éléments. L’annotation correcte est _In_reads_to_ptr_, ce qui indique la fin de la mémoire tampon avec un pointeur.

S’il n’y avait pas _to_ptr_ d’équivalent à l’annotation utilisée, l’avertissement aurait pu être traité en convertissant le last pointeur en valeur de taille avec (buffer - size) dans l’annotation.

#include <sal.h>

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