コンパイラの警告 (レベル 3) C4996Compiler Warning (level 3) C4996

コードでは、非推奨とマークされている関数、クラスメンバー、変数、または typedef を使用します。Your code uses a function, class member, variable, or typedef that's marked deprecated. シンボルは、 __declspec (非推奨)修飾子を使用して非推奨になりました。または、c++ 14 [[非推奨の]]属性で使用されています。Symbols are deprecated by using a __declspec(deprecated) modifier, or the C++14 [[deprecated]] attribute. 実際の C4996 警告メッセージは、宣言の deprecated 修飾子または属性によって指定されます。The actual C4996 warning message is specified by the deprecated modifier or attribute of the declaration.

重要

この警告は、常に、シンボルを宣言するヘッダーファイルの作成者からの意図的なメッセージです。This warning is always a deliberate message from the author of the header file that declares the symbol. 結果を理解することなく、非推奨のシンボルを使用しないでください。Don't use the deprecated symbol without understanding the consequences.

RemarksRemarks

Visual Studio ライブラリの多くの関数、メンバー関数、テンプレート関数、およびグローバル変数は非推奨とされます。Many functions, member functions, template functions, and global variables in Visual Studio libraries are deprecated. POSIX や Microsoft 固有の関数などの一部は、現在、優先名が異なるため非推奨とされます。Some, such as POSIX and Microsoft-specific functions, are deprecated because they now have a different preferred name. 一部の C ランタイムライブラリ関数は安全ではなく、より安全なバリアントがあるため、非推奨とされます。Some C runtime library functions are deprecated because they're insecure and have a more secure variant. 他のユーザーは廃止されているため、非推奨となりました。Others are deprecated because they're obsolete. 廃止されたメッセージには、通常、非推奨の関数またはグローバル変数の代替候補が含まれています。The deprecation messages usually include a suggested replacement for the deprecated function or global variable.

警告をオフにするTurn off the warning

C4996 の問題を解決するには、通常、コードを変更することをお勧めします。To fix a C4996 issue, we usually recommend you change your code. 代わりに、推奨される関数とグローバル変数を使用します。Use the suggested functions and global variables instead. 移植性のために既存の関数または変数を使用する必要がある場合は、警告をオフにすることができます。If you need to use the existing functions or variables for portability reasons, you can turn off the warning.

特定のコード行に対して警告をオフにするには、警告プラグマの #pragma warning(suppress : 4996)を使用します。To turn off the warning for a specific line of code, use the warning pragma, #pragma warning(suppress : 4996).

ファイル内の警告をオフにするには、警告プラグマの #pragma warning(disable : 4996)を使用します。To turn off the warning within a file, use the warning pragma, #pragma warning(disable : 4996).

コマンドラインビルドで警告をグローバルにオフにするには、 /wd4996コマンドラインオプションを使用します。To turn off the warning globally in command-line builds, use the /wd4996 command-line option.

Visual Studio IDE でプロジェクト全体の警告をオフにするには、次のようにします。To turn off the warning for an entire project in the Visual Studio IDE:

  1. プロジェクトの [プロパティページ] ダイアログを開きます。Open the Property Pages dialog for your project. [プロパティページ] ダイアログの使用方法の詳細については、「プロパティページ」を参照してください。For information on how to use the Property Pages dialog, see Property Pages.

  2. [構成プロパティ] > [ CC++ / > 詳細設定] ページを選択します。Select the Configuration Properties > C/C++ > Advanced page.

  3. 4996を追加するには、[特定の警告を無効にする] プロパティを編集します。Edit the Disable Specific Warnings property to add 4996. [OK] を選択して変更を適用します。Choose OK to apply your changes.

また、プリプロセッサマクロを使用して、ライブラリで使用されている特定の特定のクラスの非推奨の警告を無効にすることもできます。You can also use preprocessor macros to turn off certain specific classes of deprecation warnings used in the libraries. これらのマクロについて以下に説明します。These macros are described below.

Visual Studio でプリプロセッサマクロを定義するには、次のようにします。To define a preprocessor macro in Visual Studio:

  1. プロジェクトの [プロパティページ] ダイアログを開きます。Open the Property Pages dialog for your project. [プロパティページ] ダイアログの使用方法の詳細については、「プロパティページ」を参照してください。For information on how to use the Property Pages dialog, see Property Pages.

  2. 構成プロパティ > CC++ /> プリプロセッサ の順に展開します。Expand Configuration Properties > C/C++ > Preprocessor.

  3. [プリプロセッサの定義] プロパティで、マクロ名を追加します。In the Preprocessor Definitions property, add the macro name. [OK] を選んで保存し、プロジェクトをリビルドします。Choose OK to save, and then rebuild your project.

特定のソースファイルでのみマクロを定義するには、ヘッダーファイルを含む行の前に、#define EXAMPLE_MACRO_NAME などの行を追加します。To define a macro only in specific source files, add a line such as #define EXAMPLE_MACRO_NAME before any line that includes a header file.

次に、C4996 の警告とエラーの一般的な原因をいくつか示します。Here are some of the common sources of C4996 warnings and errors:

POSIX 関数名POSIX function names

この項目の POSIX 名は非推奨とされます。代わりに、ISO C とC++準拠した名前を使用します。新しい名前The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new-name. 詳細については、オンラインヘルプを参照してください。See online help for details.

Microsoft は、一部の POSIX および Microsoft 固有のライブラリ関数を、予約済みおよびグローバル実装定義名に対する C99 および C++ 03 制約に準拠するように名前変更しました。Microsoft renamed some POSIX and Microsoft-specific library functions in the CRT to conform with C99 and C++03 constraints on reserved and global implementation-defined names. 関数自体ではなく、名前のみが非推奨とされます。Only the names are deprecated, not the functions themselves. ほとんどの場合、準拠する名前を作成するために、関数名に先頭のアンダースコアが追加されています。In most cases, a leading underscore was added to the function name to create a conforming name. コンパイラは、元の関数名に対して非推奨の警告を発行し、優先名を提案します。The compiler issues a deprecation warning for the original function name, and suggests the preferred name.

この問題を解決するには、通常、推奨される関数名を代わりに使用するようにコードを変更することをお勧めします。To fix this issue, we usually recommend you change your code to use the suggested function names instead. ただし、更新された名前は Microsoft 固有です。However, the updated names are Microsoft-specific. 移植性のために既存の関数名を使用する必要がある場合は、これらの警告をオフにすることができます。If you need to use the existing function names for portability reasons, you can turn off these warnings. これらの関数は、ライブラリ内の元の名前の下でも使用できます。The functions are still available in the library under their original names.

これらの関数の非推奨の警告をオフにするには、プリプロセッサマクロ _CRT_NONSTDC_no_警告を定義します。To turn off deprecation warnings for these functions, define the preprocessor macro _CRT_NONSTDC_NO_WARNINGS. このマクロは、コマンドラインでオプション /D_CRT_NONSTDC_NO_WARNINGSを含めることによって定義できます。You can define this macro at the command line by including the option /D_CRT_NONSTDC_NO_WARNINGS.

Unsafe CRT ライブラリ関数Unsafe CRT Library functions

この関数または変数は安全でない可能性があります。 代わりに 、セーフバージョンを使用することを検討してください 。廃止を無効にするには、_CRT_セキュリティで保護された__警告を使用しないようにします。 詳細については、オンラインヘルプを参照してください。This function or variable may be unsafe. Consider using safe-version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Microsoft では、よりC++安全なバージョンを使用できるため、一部の CRT 関数と標準ライブラリ関数およびグローバル変数は非推奨となりました。Microsoft deprecated some CRT and C++ Standard Library functions and globals because more secure versions are available. 非推奨の関数のほとんどでは、バッファーへの読み取りまたは書き込みアクセスがチェックされません。Most of the deprecated functions allow unchecked read or write access to buffers. 誤用によって、セキュリティ上の深刻な問題が発生する可能性があります。Their misuse can lead to serious security issues. コンパイラは、これらの関数は使用されなくなったとの警告を発し、優先関数を提案します。The compiler issues a deprecation warning for these functions, and suggests the preferred function.

この問題を解決するには、代わりに関数または変数の安全なバージョンを使用することをお勧めします。To fix this issue, we recommend you use the function or variable safe-version instead. 場合によっては、移植性や下位互換性の理由ではできないことがあります。Sometimes you can't, for portability or backwards compatibility reasons. コード内でバッファーの上書きまたは過度な読み取りが発生しないことを慎重に確認してください。Carefully verify it's not possible for a buffer overwrite or overread to occur in your code. その後、警告をオフにすることができます。Then, you can turn off the warning.

CRT でこれらの関数の非推奨の警告をオフにするには _crt_セキュリティで保護された__警告を定義します。To turn off deprecation warnings for these functions in the CRT, define _CRT_SECURE_NO_WARNINGS.

非推奨のグローバル変数に関する警告をオフにするには _CRT_セキュリティで保護された__警告_GLOBALSを定義します。To turn off warnings about deprecated global variables, define _CRT_SECURE_NO_WARNINGS_GLOBALS.

これらの非推奨の関数とグローバルの詳細については、「 CRT のセキュリティ機能」および「安全なライブラリ: C++標準ライブラリ」を参照してください。For more information about these deprecated functions and globals, see Security Features in the CRT and Safe Libraries: C++ Standard Library.

安全でない標準ライブラリ関数Unsafe Standard Library functions

' std:: function_name ::_Unchecked_の反復子::_ は、安全でない可能性のあるパラメーターを使用した std::function_nameの呼び出しを避けます。この呼び出しは、渡された値が正しいことを確認するために呼び出し元に依存します。この警告を無効にするには、-D_SCL_セキュリティで保護された__警告は使用しません。C++ Visual ' チェックされた反復子の使用方法に関するドキュメントを参照してください'std::function_name::_Unchecked_iterators::_Deprecate' Call to std::function_name with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'

この警告は、一部C++の標準ライブラリのテンプレート関数ではパラメーターが正しいかどうかのチェックが行われないため、デバッグビルドに表示されます。This warning appears in debug builds because certain C++ Standard Library template functions don't check parameters for correctness. 多くの場合、コンテナーの境界を確認するために関数で使用できる情報が不足していることが原因です。Often it's because not enough information is available to the function to check container bounds. または、反復子が関数で不適切に使用されている可能性があります。Or, because iterators may be used incorrectly with the function. この警告は、これらの関数を識別するのに役立ちます。これは、プログラムに重大なセキュリティホールがある可能性があるためです。This warning helps you identify these functions, because they may be a source of serious security holes in your program. 詳細については、「チェックを行う反復子」を参照してください。For more information, see Checked iterators.

たとえば、この警告は、プレーン配列ではなく std::copyに要素ポインターを渡すと、デバッグモードで表示されます。For example, this warning appears in Debug mode if you pass an element pointer to std::copy, instead of a plain array. この問題を解決するには、適切に宣言された配列を使用して、ライブラリが配列の範囲を確認し、境界のチェックを実行できるようにします。To fix this issue, use an appropriately declared array, so the library can check the array extents and do bounds checking.

// C4996_copyarray.cpp
// compile with: cl /c /W4 /D_DEBUG C4996_copyarray.cpp
#include <algorithm>

void example(char const * const src) {
    char dest[1234];
    char * pdest3 = dest + 3;
    std::copy(src, src + 42, pdest3); // C4996
    std::copy(src, src + 42, dest);   // OK, copy can tell that dest is 1234 elements
}

C++ 14 では、いくつかの標準ライブラリアルゴリズムが "デュアル範囲" バージョンに更新されました。Several standard library algorithms were updated to have "dual range" versions in C++14. 2つの範囲のバージョンを使用する場合、2番目の範囲は必要な範囲チェックを行います。If you use the dual range versions, the second range provides the necessary bounds checking:

// C4996_containers.cpp
// compile with: cl /c /W4 /D_DEBUG C4996_containers.cpp
#include <algorithm>

bool example(
    char const * const left,
    const size_t leftSize,
    char const * const right,
    const size_t rightSize)
{
    bool result = false;
    result = std::equal(left, left + leftSize, right); // C4996
    // To fix, try this form instead:
    // result = std::equal(left, left + leftSize, right, right + rightSize); // OK
    return result;
}

この例では、標準ライブラリを使用して反復子の使用法を確認する方法をいくつか示します。また、チェックをオフにした場合には危険な場合があります。This example demonstrates several more ways the standard library may be used to check iterator usage, and when unchecked usage may be dangerous:

// C4996_standard.cpp
// compile with: cl /EHsc /W4 /MDd C4996_standard.cpp
#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <numeric>
#include <string>
#include <vector>

using namespace std;

template <typename C> void print(const string& s, const C& c) {
    cout << s;

    for (const auto& e : c) {
        cout << e << " ";
    }

    cout << endl;
}

int main()
{
    vector<int> v(16);
    iota(v.begin(), v.end(), 0);
    print("v: ", v);

    // OK: vector::iterator is checked in debug mode
    // (i.e. an overrun triggers a debug assertion)
    vector<int> v2(16);
    transform(v.begin(), v.end(), v2.begin(), [](int n) { return n * 2; });
    print("v2: ", v2);

    // OK: back_insert_iterator is marked as checked in debug mode
    // (i.e. an overrun is impossible)
    vector<int> v3;
    transform(v.begin(), v.end(), back_inserter(v3), [](int n) { return n * 3; });
    print("v3: ", v3);

    // OK: array::iterator is checked in debug mode
    // (i.e. an overrun triggers a debug assertion)
    array<int, 16> a4;
    transform(v.begin(), v.end(), a4.begin(), [](int n) { return n * 4; });
    print("a4: ", a4);

    // OK: Raw arrays are checked in debug mode
    // (i.e. an overrun triggers a debug assertion)
    // NOTE: This applies only when raw arrays are
    // given to C++ Standard Library algorithms!
    int a5[16];
    transform(v.begin(), v.end(), a5, [](int n) { return n * 5; });
    print("a5: ", a5);

    // WARNING C4996: Pointers cannot be checked in debug mode
    // (i.e. an overrun triggers undefined behavior)
    int a6[16];
    int * p6 = a6;
    transform(v.begin(), v.end(), p6, [](int n) { return n * 6; });
    print("a6: ", a6);

    // OK: stdext::checked_array_iterator is checked in debug mode
    // (i.e. an overrun triggers a debug assertion)
    int a7[16];
    int * p7 = a7;
    transform(v.begin(), v.end(),
        stdext::make_checked_array_iterator(p7, 16),
        [](int n) { return n * 7; });
    print("a7: ", a7);

    // WARNING SILENCED: stdext::unchecked_array_iterator
    // is marked as checked in debug mode, but it performs no checking,
    // so an overrun triggers undefined behavior
    int a8[16];
    int * p8 = a8;
    transform( v.begin(), v.end(),
        stdext::make_unchecked_array_iterator(p8),
        [](int n) { return n * 8; });
    print("a8: ", a8);
}

コードでバッファーオーバーランエラーが発生しないことを確認した場合は、この警告をオフにすることができます。If you've verified that your code can't have a buffer-overrun error, you can turn off this warning. これらの関数の警告をオフにするには _SCL_セキュリティで保護された__警告を定義します。To turn off warnings for these functions, define _SCL_SECURE_NO_WARNINGS.

チェックを行う反復子有効Checked iterators enabled

また、_ITERATOR_DEBUG_LEVEL が1または2として定義されている場合に、チェックを行う反復子を使用しないと、C4996 も発生する可能性があります。C4996 can also occur if you don't use a checked iterator when _ITERATOR_DEBUG_LEVEL is defined as 1 or 2. これは、デバッグモードのビルドでは既定で2に設定され、リテールビルドの場合は0に設定されます。It's set to 2 by default for debug mode builds, and to 0 for retail builds. 詳細については、「チェックを行う反復子」を参照してください。For more information, see Checked iterators.

// C4996_checked.cpp
// compile with: /EHsc /W4 /MDd C4996_checked.cpp
#define _ITERATOR_DEBUG_LEVEL 2

#include <algorithm>
#include <iterator>

using namespace std;
using namespace stdext;

int main() {
    int a[] = { 1, 2, 3 };
    int b[] = { 10, 11, 12 };
    copy(a, a + 3, b + 1);   // C4996
    // try the following line instead:
    // copy(a, a + 3, checked_array_iterator<int *>(b, 3));   // OK
}

Unsafe MFC または ATL コードUnsafe MFC or ATL code

C4996 は、セキュリティ上の理由から非推奨とされた MFC 関数または ATL 関数を使用した場合に発生する可能性があります。C4996 can occur if you use MFC or ATL functions that were deprecated for security reasons.

この問題を解決するには、代わりに更新された関数を使用するようにコードを変更することを強くお勧めします。To fix this issue, we strongly recommend you change your code to use updated functions instead.

これらの警告を抑制する方法の詳細については、「 _AFX_SECURE_NO_WARNINGS」を参照してください。For information on how to suppress these warnings, see _AFX_SECURE_NO_WARNINGS.

廃止された CRT 関数と変数Obsolete CRT functions and variables

この関数または変数は、新しいライブラリまたはオペレーティングシステムの機能に置き換えられました。代わりに new_item の使用を検討してください 。詳細については、オンラインヘルプを参照してください。This function or variable has been superseded by newer library or operating system functionality. Consider using new_item instead. See online help for details.

一部のライブラリ関数およびグローバル変数は非推奨とされるため使用されていません。Some library functions and global variables are deprecated as obsolete. これらの関数および変数は、将来のバージョンのライブラリでは削除される可能性があります。These functions and variables may be removed in a future version of the library. コンパイラは、これらの項目は使用されなくなったとの警告を発行し、優先すべき代替項目を提案します。The compiler issues a deprecation warning for these items, and suggests the preferred alternative.

この問題を解決するには、推奨される関数または変数を使用するようにコードを変更することをお勧めします。To fix this issue, we recommend you change your code to use the suggested function or variable.

これらの項目について非推奨の警告をオフにするには _CRT_廃止__警告は定義しません。To turn off deprecation warnings for these items, define _CRT_OBSOLETE_NO_WARNINGS. 詳しくは、非推奨の関数または変数のドキュメントをご覧ください。For more information, see the documentation for the deprecated function or variable.

CLR コードのマーシャリングエラーMarshaling errors in CLR code

C4996 は、CLR マーシャリングライブラリを使用するときにも発生する可能性があります。C4996 can also occur when you use the CLR marshaling library. この場合、C4996 はエラーであり、警告ではありません。In this case, C4996 is an error, not a warning. このエラーは、 marshal_asを使用して、 marshal_context クラスを必要とする2つのデータ型の間で変換を行う場合に発生します。The error occurs when you use marshal_as to convert between two data types that require a marshal_context Class. また、マーシャリングライブラリが変換をサポートしていない場合にも、このエラーが発生することがあります。You can also receive this error when the marshaling library doesn't support a conversion. マーシャリングライブラリの詳細については、「 」 C++の「マーシャリングの概要」を参照してください。For more information about the marshaling library, see Overview of marshaling in C++.

この例では、マーシャリングライブラリが System::String から const char *に変換するコンテキストを必要とするため、C4996 が生成されます。This example generates C4996 because the marshaling library requires a context to convert from a System::String to a const char *.

// C4996_Marshal.cpp
// compile with: /clr
// C4996 expected
#include <stdlib.h>
#include <string.h>
#include <msclr\marshal.h>

using namespace System;
using namespace msclr::interop;

int main() {
   String^ message = gcnew String("Test String to Marshal");
   const char* result;
   result = marshal_as<const char*>( message );
   return 0;
}

例: ユーザー定義の非推奨の関数Example: User-defined deprecated function

特定の関数の使用が推奨されなくなったときに、独自のコードで非推奨の属性を使用して、呼び出し元に警告することができます。You can use the deprecated attribute in your own code to warn callers when you no longer recommend use of certain functions. この例では、C4996 は、非推奨の関数が宣言されている行と、関数が使用されている行の2つの場所で生成されます。In this example, C4996 is generated in two places: One for the line the deprecated function is declared on, and one for the line where the function is used.

// C4996.cpp
// compile with: /W3
// C4996 warning expected
#include <stdio.h>

// #pragma warning(disable : 4996)
void func1(void) {
   printf_s("\nIn func1");
}

[[deprecated]]
void func1(int) {
   printf_s("\nIn func2");
}

int main() {
   func1();
   func1(1);    // C4996
}