C6053
警告 C6053: <関数> への呼び出しは、文字列 <変数> を 0 で終了しない可能性があります。
この警告は、結果の文字列が 0 で終了しないような方法で、指定された関数が呼び出されたことを示します。 この問題によって、攻撃に利用される可能性のあるバッファー オーバーランまたはクラッシュが発生する場合があります。 注釈が付けられた関数で、Pre 条件の NullTerminated プロパティを使用し、null で終了する文字列が想定されている場合に、null で終了しない文字列が渡されたときにもこの警告が生成されます。
ほとんどの C 標準ライブラリおよび Win32 文字列処理関数では、0 で終了する文字列が必要とされ、生成されます。 一部の "計数文字列" の関数 (strncpy、wcsncpy、_mbsncpy、_snprintf、および snwprintf) は、関数のバッファーが正確に満たされている場合、0 で終了する文字列を生成しません。 この場合、次に 0 で終了する文字列を想定する文字列関数を呼び出したときに、バッファーの終端を超えて 0 が検索されます。 プログラムで、文字列が 0 で終わることを確認する必要があります。 一般的に有効な解決方法は、"計数文字列" 関数にバッファーのサイズよりも 1 小さい長さを渡し、バッファー内の最後の文字に明示的に 0 を代入する方法です。
使用例
この警告が発生するコード例を次に示します。
#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
}
この警告を解決するには、次のサンプルコードに示すように文字列を 0 で終了させます。
#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