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 ...
}
Следует отметить, что для некоторых стилей создания кода используемая эвристика может оказаться неверной. Поэтому данное предупреждение может не соответствовать фактической ошибке кода.