C6209
警告 C6209: 使用 'sizeof<variable1>' 做為參數 <number> (於 <function> 呼叫中),其中 <variable2> 可能為寬字元的陣列。您是否想要使用字元計數而非位元組計數?
這個警告表示函式呼叫 (Function Call) 的參數可能誤用了位元組計數,來代替字元計數。 如果是這種情形,這項缺失可能會導致記憶體損毀或程式當機,而部分狀況可能會造成可遭人利用的安全性漏洞。
這項缺失的一般原因是在字元陣列上使用 sizeof。 sizeof 運算子一律會計算位元組的數目。 若為 ANSI 字元,則這會與字元的數目相同,但是若為 Unicode 字元,則是字元數目的兩倍。
安全的做法是將陣列大小除以每個元素的大小,以計算陣列中的元素數目。
這個警告的產生時機為:
變數是做為某個參數予以傳遞,而 sizeof 變數則是做為另一個參數予以傳遞。
變數型別及型式參數型別都是某種指標與寬字元的變異。
範例
下列範例程式碼會因為將 sizeof pC 傳遞至 my_wcsncpy 函式,而產生這個警告:
#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 ...
}
應注意的是,使用的啟發學習法 (Heuristic) 可能對特定程式碼樣式而言不正確,因此,這個警告可能無法與程式碼中的實際缺失相對應。