C6067
avertissement C6067 : paramètre <numéro> dans l'appel à <fonction> doit être l'adresse de la chaîne
Cet avertissement indique une incompatibilité entre le spécificateur de format et le paramètre de fonction. Bien que l'avertissement suggère d'utiliser l'adresse de la chaîne, vous devez vérifier le type de paramètre attendu par une fonction avant de corriger le problème. Par exemple, une spécification %s pour printf requiert un argument de chaîne, mais une spécification %s dans scanf requiert une adresse de la chaîne.
Ce défaut risque de provoquer un blocage ou une altération, sous une forme quelconque.
Exemple
Le code suivant génère cet avertissement car un entier est passé au lieu d'une chaîne :
#include <stdio.h>
void f_defective( )
{
char *str = "Hello, World!";
printf("String:\n %s",1); // warning
// code ...
}
Pour corriger l'avertissement, passez une chaîne comme paramètre à printf, comme indiqué dans le code suivant :
#include <stdio.h>
void f_corrected( )
{
char *str = "Hello, World!";
printf("String:\n %s",str);
// code ...
}
Le code suivant génère cet avertissement car un niveau d'indirection incorrect est spécifié lors du passage du paramètre, buffer, à scanf:
#include <stdio.h>
void h_defective( )
{
int retval;
char* buffer = new char(20);
if ( buffer )
{
retval = scanf("%s", &buffer); // warning C6067
// code...
delete buffer ;
}
}
Pour corriger les avertissements précités, passez le paramètre correct comme indiqué dans le code suivant :
#include <stdio.h>
void h_corrected( )
{
int retval;
char* buffer = new char(20);
if ( buffer )
{
retval = scanf("%s", buffer);
// code...
delete buffer;
}
}
Le code suivant utilise des fonctions de manipulation de chaîne sécurisées pour corriger cet avertissement :
#include <stdio.h>
void f_safe( )
{
char buff[20];
int retVal;
sprintf_s( buff, 20, "%s %s", "Hello", "World!" );
printf_s( "String:\n %s %s", "Hello", "World!" );
retVal = scanf_s("%s", buff, 20);
}
Voir aussi
Référence
sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l