Avertissement C6066

Non-pointeur passé en tant que paramètre(number) lorsque le pointeur est requis dans l’appel à 'function'.

Notes

Cet avertissement indique que la chaîne de format spécifie qu’un pointeur est requis, mais qu’un non-pointeur est passé. Un pointeur est requis, par exemple, lorsque vous utilisez une ou spécification pour printf, ou pour scanf.%d%p%n Ce défaut est susceptible d’entraîner un blocage ou une corruption d’une forme quelconque.

Nom de l’analyse du code : NON_POINTER_ARGUMENT_TO_FORMAT_FUNCTION

Exemple

Le code suivant génère cet avertissement :

#include <stdio.h>
#define MAX 30
void f( )
{
  char buff[MAX];
  sprintf( buff, "%s %p %d", "Hello, World!", 1, MAX ); //warning C6066
  // code ...
}

void g( int i )
{
   int result = scanf( "%d", i ); // warning C6066
   // code ...
}

Pour corriger cet avertissement, le code suivant transmet les paramètres appropriés aux fonctions et scanf aux sprintf fonctions :

#include <stdio.h>
#define MAX 30

void f( )
{
   char buff[MAX];
   sprintf( buff, "%s %p %d", "Hello, World!", buff, MAX ); // pass buff
   // code ...
}
void g( int i )
{
   int result = scanf( "%d", &i ); // pass the address of i
   // code ...
}

Le code suivant utilise des fonctions sprintf_s de manipulation de chaîne sécurisées et scanf_s corrige cet avertissement :

void f( )
{
   char buff[MAX];
   sprintf_s( buff, sizeof(buff), "%s %p %d", "Hello, World!", buff, MAX );
   // code ...
}
void g( int i )
{
   int result = scanf_s( "%d", &i );
   // code ...
}

Cet avertissement est généralement signalé, car un entier a été utilisé pour un %p format au lieu d’un pointeur. L’utilisation d’un entier dans cette instance n’est pas portable pour les ordinateurs 64 bits.

Voir aussi

Syntaxe de spécification de format : fonctions printf et wprintf
sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l
C4313
C4477