Freigeben über


Compilerwarnung (Stufe 3) C4996

'Funktion': wurde als veraltet deklariert oder 'std::<Funktionsname>': Funktionsaufruf mit Parametern, die möglicherweise unsicher sind. Bei diesem Aufruf ist es wichtig, dass der Aufrufer die Korrektheit der übergebenen Werte überprüft.Sie können diese Warnung mit D_SCL_SECURE_NO_WARNINGS deaktivieren.Informationen zur Verwendung der überprüften Iteratoren von Visual C++ finden Sie in der Dokumentation.

Diese Warnung/dieser Fehler hat mehrere Bedeutungen.

Der Fehler C4996 kann auftreten, wenn der Compiler eine als veraltet gekennzeichnete Funktion vorfindet. Die Funktion wird in zukünftigen Versionen u. U. nicht mehr unterstützt. Sie können diese Warnung mit dem Pragma warning deaktivieren (nachfolgendes Beispiel).

Einige CRT-Funktionen und C++-Standardbibliotheksfunktionen wurden zugunsten von neuen, sichereren Funktionen nicht mehr implementiert. Weitere Informationen über die Funktion, die stattdessen verwendet werden sollte, finden Sie in der Dokumentation zu der in der Fehlermeldung angegebenen veralteten Funktion. Wenn Sie CRT-Veraltungswarnungen deaktivieren möchten, definieren Sie _CRT_SECURE_NO_WARNINGS. Weitere Informationen über veraltete Funktionen finden Sie unter Sicherheitsfunktionen in der CRT und unter Sichere Bibliotheken: C++-Standardbibliothek.

C4996 wird beispielsweise bei Verwendung von Membern aus den Headerdateien <hash_map> und <hash_set> im std-Namespace ausgegeben. Weitere Informationen finden Sie unter Der stdext-Namespace.

C4996 kann auch bei der Verwendung von MFC-Funktionen oder ATL-Funktionen auftreten, die aus Sicherheitsgründen nicht mehr implementiert wurden. Weitere Informationen zum Unterdrücken dieser Warnungen finden Sie unter _AFX_SECURE_NO_WARNINGS und _ATL_SECURE_NO_WARNINGS.

C4996 kann auch auftreten, wenn Sie die Marshallingbibliothek verwenden. In diesem Fall ist C4996 ein Fehler, keine Warnung. Dieser Fehler tritt auf, wenn Sie marshal_as für die Konvertierung zwischen zwei Datentypen verwenden, die eine marshal_context-Klasse benötigen. Der Fehler wird auch angezeigt, wenn die Marshallingbibliothek keine Konvertierung unterstützt. Weitere Informationen über die Marshallingbibliothek finden Sie unter Übersicht über das Marshaling in C++.

Im ersten Beispiel wird C4996 für die Zeile generiert, in der die Funktion deklariert wird, sowie für die Zeile, in der die Funktion verwendet wird.

Beispiel

Im folgenden Beispiel wird C4996 generiert.

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

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

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

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

C4996 kann auch auftreten, wenn Sie beim Kompilieren mit _ITERATOR_DEBUG_LEVEL keinen überprüften Iterator definieren (dieser ist beim Buildvorgang im Debugmodus standardmäßig auf 1 festgelegt). Weitere Informationen finden Sie unter Überprüfte Iteratoren.

Im folgenden STL-Codebeispiel wird der Fehler C4996 erzeugt.

// C4996_b.cpp
// compile with: /EHsc /W3 /c
#define _ITERATOR_DEBUG_LEVEL 1

#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, b);
    copy(a, a + 3, checked_array_iterator<int *>(b, 3));   // OK
}

Im folgenden STL-Codebeispiel wird C4996 als Warnung erzeugt. Das Beispiel enthält Inlinekommentare.

#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 will trigger 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 will trigger 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 will trigger a debug assertion)
    // NOTE: This applies only when raw arrays are given to STL 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 will trigger 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 will trigger 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
    // (i.e. it performs no checking, so an overrun will trigger 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);
}

Im folgenden Beispiel wird C4996 erzeugt, weil die Marshallingbibliothek einen Kontext benötigt, um von System::String in const char * zu konvertieren.

// 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;
}