Strsafe.h について

バッファーの処理が不適切なのは、バッファー オーバーランを伴う多くのセキュリティの問題に関係しています。 Strsafe.h で定義されている関数は、コード内で適切なバッファー処理を行うための追加処理を提供します。 このため、組み込みの C/C++ に対応する実装と、特定のWindows実装を置き換えることを目的としています。 Strsafe.h は、Service Pack 2 (SP2) を使用した Windows XP 以降の Windows SDK で使用できます。

Strsafe 関数の利点は次のとおりです。

  • コピー先バッファーのサイズは常に関数に提供され、関数がバッファーの末尾を超えて書き込まれないようにします。

  • 操作で目的の結果が切り捨てられた場合でも、バッファーは null で終了することが保証されます。

  • すべての関数は HRESULT 値を返し、可能な成功コード (S_OK) は 1 つだけです。

  • 各関数は、対応する文字カウント ("cch") またはバイトカウント ("cb") バージョンで使用できます。

  • ほとんどの関数には、高度な機能に使用できる拡張 ("Ex") バージョンがあります。

詳細については、以下のセクションを参照してください。

文字数関数

次の関数では、バイトカウントではなく文字数を使用します。

関数 置き換えます
StringCchCat
StringCchCatEx
strcat、wcscat、_tcsat
lstrcat
StrCat
StrCatBuff
StringCchCatN
StringCchCatNEx
strncat
StrNCat
StringCchCopy
StringCchCopyEx
strcpy、wcscpy、_tcscpy
lstrcpy
Strcpy
StringCchCopyN
StringCchCopyNEx
strncpy、wcsncpy、_tcsncpy
StringCchGets
StringCchGetsEx
取得、_getws、_getts
StringCchPrintf
StringCchPrintfEx
sprintf、swprintf、_stprintf
wsprintf
wnsprintf
_snprintf、_snwprintf、_sntprintf
StringCchVPrintf
StringCchVPrintfEx
vsprintf、vswprintf、_vstprintf
vsnprintf、_vsnwprintf、_vsntprintf
wvsprintf
wvnsprintf
,
StringCchLength
strlen、wcslen、_tcslen

 

バイトカウント関数

次の関数では、文字カウントではなくバイト数を使用します。

関数 置き換えます
StringCbCat
StringCbCatEx
strcat、wcscat、_tcsat
lstrcat
StrCat
StrCatBuff
StringCbCatN
StringCbCatNEx
strncat
StrNCat
StringCbCopy
StringCbCopyEx
strcpy、wcscpy、_tcscpy
lstrcpy
Strcpy
StringCbCopyN
StringCbCopyNEx
strncpy、wcsncpy、_tcsncpy
StringCbGets
StringCbGetsEx
取得、_getws、_getts
StringCbPrintf
StringCbPrintfEx
sprintf、swprintf、_stprintf
wsprintf
wnsprintf
_snprintf、_snwprintf、_sntprintf
StringCbVPrintf
StringCbVPrintfEx
vsprintf、vswprintf、_vstprintf
vsnprintf、_vsnwprintf、_vsntprintf
wvsprintf
wvnsprintf
StringCbLength
strlen、wcslen、_tcslen

 

Strsafe.h の使用

  • Strsafe 関数をインラインで使用するには、他のすべてのヘッダー ファイルの #include ステートメントに従って、次に示すようにヘッダー ファイルを含めます。

    #include <strsafe.h>

  • ライブラリ形式で関数を使用するには、Strsafe.h を含める前に次のステートメントを含めます。 ただし、インライン関数を使用することをお勧めします。

    #define STRSAFE_LIB

    Note

    : 次の関数をインライン関数として使用する必要があります: StringCbGetsStringCbGetsExStringCchGetsおよび StringCchGetsEx

     

  • ファイルに Strsafe.h を含めると、Strsafe.h 関数に置き換えられた古い関数は非推奨になります。 これらの古い関数を使用しようとすると、新しい関数を使用するように指示するコンパイラ エラーが発生します。 この動作をオーバーライドする場合は、Strsafe.h を含める前に次のステートメントを含めてください。

    #define STRSAFE_NO_DEPRECATE

  • 文字カウント関数のみを許可するには、Strsafe.h を含める前に次のステートメントを含めます。

    #define STRSAFE_NO_CB_FUNCTIONS

  • バイト数関数のみを許可するには、Strsafe.h を含める前に次のステートメントを含めます。

    #define STRSAFE_NO_CCH_FUNCTIONS

    Note

    STRSAFE_NO_CB_FUNCTIONSまたはSTRSAFE_NO_CCH_FUNCTIONSを定義できますが、両方を定義することはできません。

     

  • 一部の Strsafe 関数には、ロケール対応のバージョンがあります。 既定では、ヘッダーはこれらの関数を宣言しません。 これらの宣言を有効にするには、Strsafe.h を含める前に次のマクロ ステートメントを含めます。

    #define STRSAFE_LOCALE_FUNCTIONS

  • サポートされる文字列の最大長は、ANSI または Unicode の 2,147,483,647 (STRSAFE_MAX_CCH) 文字です。

Strsafe 関数