C6053
警告 C6053: <function> 的呼叫可能沒有以零結束的字串 <variable>
這則警告表示指定之函式是以結果字串可能不是以零結束的方式呼叫。 這項缺失可能會造成可利用的緩衝區滿溢或損毀。 如果將不是以 null 結束的字串傳遞給必須要有以 null 結束之字串的加註函式 (在其 Pre 條件中使用 NullTerminated 屬性),也會產生這則警告。
大部分 C 標準程式庫和 Win32 字串處理函式會需要並產生以零結束的字串。 如果「計數字串」函式 (包括 strncpy、wcsncpy、_mbsncpy、_snprintf 和 snwprintf) 會完全填滿其緩衝區,則這些函式並不會產生以零結束的字串。 在此情況下,對於必須要有以零結束之字串的字串函式的後續呼叫,將會超出尋找零的緩衝區結尾。 程式應該確定字串是以零結尾。 其中一個實用方法通常就是將比緩衝區大小少一的長度傳遞至「計數字串」函式,然後將零明確指派給緩衝區中的最後一個字元。
範例
下列範例程式碼會產生這則警告:
#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);
}
下列程式碼會使用附註產生警告 C6053:
#include<codeanalysis\sourceannotations.h>
using namespace vc_attributes;
void NotNullTerminatedStringReturned
(
[Post(NullTerminated=No)] char* str
)
{
// code ...
}
void NullTerminatedStringRequired ([Pre(NullTerminated=Yes)] char* str)
{
// code ...
}
void f (char* pC )
{
NotNullTerminatedStringReturned(pC); //pC is not null terminated
NullTerminatedStringRequired(pC); //requires null terminated pC
}
您應該注意到,這則警告有時會以某些保證實際上很安全的習慣用語來報告。 由於這項缺失的頻率和可能後果,分析工具會偏好找出潛在問題,而不是通常會做的減少雜訊。
請參閱
參考
strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l