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