C6209

更新:2007 年 11 月

警告 C6209:正在使用“sizeof <variable1>”作为参数 <number> 调用 <function>,其中 <variable2> 可能是一个宽字符数组,是否要使用字符数而不是字节数?

此警告指出函数调用的参数可能是字节数,而不是字符数。这是错误的。如果属于这种情况,则此缺陷可能导致内存损坏或程序故障,但某些情况可能会导致可利用的安全漏洞。

产生此缺陷的一个常见原因是对字符数组使用了 sizeof。sizeof 运算符总是计算字节数。对于 ANSI 字符而言,字节数与字符数相同;但是,对于 Unicode 字符而言,字节数是字符数的两倍。

通常,可以放心地通过将数组的大小除以每个元素的大小来计算数组中的元素数。

此警告会在以下情况下生成:

  • 变量作为一个参数传递,该变量的 sizeof 作为另一个参数传递。

  • 变量类型和形参类型均是某种指向宽字符的指针。

示例

下面的示例代码生成了此警告,因为向 my_wcsncpy 函数传递了 sizeofpC:

#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

The sizeof Operator