Поделиться через


Предупреждение 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_lswprintf_s_swprintf_s_l
scanf_s, , _scanf_s_lwscanf_s_wscanf_s_l
C4313
C4477