Предупреждение C6066
Без указателя, передаваемый как параметр(число), если указатель требуется при вызове функции.
Замечания
Это предупреждение указывает, что строка формата указывает, что требуется указатель, но передается ненулевое значение. Указатель требуется, например, при использовании %n
или %p
спецификации для printf
или %d
для scanf
. Этот дефект, скорее всего, приведет к сбою или повреждению какой-либо формы.
Имя анализа кода: NON_POINTER_ARGUMENT_TO_FORMAT_FUNCTION
Пример
Следующий код создает это предупреждение:
#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 ...
}
Чтобы исправить это предупреждение, следующий код передает правильные параметры в sprintf
функции и scanf
функции:
#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 ...
}
В следующем коде используются функции sprintf_s
безопасной обработки строк и scanf_s
исправление этого предупреждения:
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 ...
}
Это предупреждение обычно сообщается, так как целое число используется для %p
формата вместо указателя. Использование целого числа в этом экземпляре не переносится на 64-разрядные компьютеры.
См. также
Синтаксис спецификации форматирования: функции printf и wprintf
sprintf_s
, , _sprintf_s_l
swprintf_s
_swprintf_s_l
scanf_s
, , _scanf_s_l
wscanf_s
_wscanf_s_l
C4313
C4477