Strsafe.h について

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

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

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

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

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

  • 各関数は、対応する文字カウント ("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
gets、_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
gets、_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

    注意

    : インライン関数として使用する必要がある関数は、 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

    注意

    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 関数