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


C6209

Предупреждение C6209: используется "sizeof<variable1>" в качестве параметра <номер> в вызове <функции>, где <variable2> может быть массивом широких символов. Предполагалось использовать счетчик символов вместо счетчика байтов?

Данное предупреждение означает, что в качестве параметра при вызове функции неверно передается количество байтов, а не количество знаков. В таком случае имеется вероятность повреждения памяти или сбоя программы, хотя в некоторых ситуациях возможно возникновение уязвимостей системы безопасности.

Наиболее распространенной причиной этой ошибки является использование sizeof для массива знаков. Оператор sizeof всегда вычисляет количество байтов. В случае использования кодировки ANSI это значение совпадает с количеством знаков, однако для Юникода оно вдвое превышает количество знаков.

Как правило, более безопасно вычислять количество элементов массива, разделив размер массива на размер каждого элемента.

Это предупреждение создается в указанных ниже случаях.

  • Переменная передается в качестве одно параметра, а результат применения оператора sizeof к этой переменной передается в качестве другого параметра.

  • Тип переменной и формальный тип параметра являются разновидностями типа PCWSTR.

Пример

В следующем примере коде в результате передачи в функцию my_wcsncpy значения sizeof pC создается данное предупреждение.

#include<windows.h>
extern void my_wcsncpy(wchar_t *, wchar_t *, size_t);

void f( )
{
  WCHAR pC[15];
  wchar_t* input = L"Hello, World!";
  
  my_wcsncpy(pC, input, sizeof pC);
  // code ...
}

Для устранения этого предупреждения передайте правильный размер, как указано в следующем коде:

#include<windows.h>
extern void my_wcsncpy(wchar_t *, wchar_t *, size_t);

void f( )
{
  WCHAR pC[15];
  wchar_t* input = L"Hello, World!";
  
  my_wcsncpy(pC, input, (sizeof pC) / (sizeof pC[0]));
  // code ...
}

Следует отметить, что для некоторых стилей создания кода используемая эвристика может оказаться неверной. Поэтому данное предупреждение может не соответствовать фактической ошибке кода.

См. также

Ссылки

sizeof Operator

sizeof Operator (C)