警告 C6053
呼叫 ' function ' 可能不會以零結尾的字串 ' variable '。
備註
這個警告表示指定的函式已呼叫,因此產生的字串可能不會以零終止的方式呼叫。 此瑕疵可能會導致惡意探索緩衝區滿溢或當機。 如果批註函式預期有 Null 終止的字串,但您傳遞非 Null 終止的字串,也會產生這個警告。
大部分 C 標準程式庫和 Win32 字串處理函式都需要並產生零終止的字串。 一些「計算字串」函式(包括 strncpy
、 wcsncpy
、 _mbsncpy
、 _snprintf
和 snwprintf
)若完全填滿緩衝區,則不會產生以零終止的字串。 在此情況下,預期以零結束字串的字串函式後續呼叫將會超出尋找零的緩衝區結尾。 程式應該確定字串結尾為零。 一般而言,您應該將長度傳遞給小於緩衝區大小的 'counted string' 函式,然後明確地將零指派給緩衝區中的最後一個字元。
程式碼分析名稱: MISSING_ZERO_TERMINATION1
範例
下列範例程式碼會產生此警告:
#include <string.h>
#define MAX 15
size_t f( )
{
char szDest[MAX];
char *szSource="Hello, World!";
strncpy(szDest, szSource, MAX);
return strlen(szDest); // possible crash here
}
若要更正此警告,請以零結束字串,如下列範例程式碼所示:
#include <string.h>
#define MAX 15
size_t f( )
{
char szDest[MAX];
char *szSource="Hello, World!";
strncpy(szDest, szSource, MAX-1);
szDest[MAX-1]=0;
return strlen(szDest);
}
下列範例程式碼會使用安全字串操作 strncpy_s
函式更正此警告:
#include <string.h>
#define MAX 15
size_t f( )
{
char szDest[MAX];
char *szSource= "Hello, World!";
strncpy_s(szDest, sizeof(szDest), szSource, strlen(szSource));
return strlen(szDest);
}
啟發學習法
有時會針對保證在實務上安全的某些慣用語報告此警告。 由於此缺陷的頻率和潛在後果,分析工具偏向于尋找潛在問題,而不是降低雜訊的典型偏差。