Speichern Sie Vorlagen-Überladungen
Viele CRT-Funktionen sind, SECURITY-erhöhten zugunsten der neueren Versionen veraltet (z. B. ist strcpy_s der sicherere Ersatz für strcpy).Die CRT- stellt Vorlagen Operatoren, um den Übergang zu den sichereren Varianten zu erleichtern.
Dieser Code generiert z. B. eine Warnung, weil strcpy veraltet ist:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
Sie können diese Warnung ignorieren.Definieren Sie das Symbol _CRT_SECURE_NO_WARNINGS , um die Warnung zu unterdrücken, oder aktualisieren Sie den Code, um strcpy_szu verwenden:
char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function
Die Vorlagen Operatoren stellen zusätzliche Optionen.Das Definieren von _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES bis 1 aktiviert Standard-CRT von Überladungen Vorlagen, die den sichereren Varianten automatisch aufrufen.Wenn _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 ist, sind keine Änderungen am Code erforderlich.Im Hintergrund wird der Aufruf strcpy zu einem Aufruf von strcpy_s mit dem Argument Größe geändert, das automatisch angegeben wird.
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
...
char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES wirkt sich nicht auf die Funktionen, die eine Zahl annehmen, wie strncpy.Um Operatoren Vorlagen für die Anzahl von Funktionen zu aktivieren, definieren Sie _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT bis 1.Vor Fall überprüfen Sie, ob der Code jedoch die Anzahl der Zeichen führt, nicht die Größe des Puffers (ein häufiger Fehler).In Code, der explizit ein NULL-Abschlusszeichen am Ende des Puffers geschrieben wird, nachdem der Funktionsaufruf nicht erforderlich ist, wenn die sichere Variante aufgerufen wird.Wenn Sie das Abschneiden erfordern, finden Sie unter _TRUNCATE.
Hinweis |
---|
Makro- _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT erfordert, dass _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES ebenfalls als 1 definiert wird.Wenn _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT definiert wird, während 1 und _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES als 0 definiert ist, führt die Anwendung keine Vorlagen Operatoren aus. |
Das Definieren von Vorlagen können bis zu 1 _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES Überladungen der sicheren Varianten (die Namen, „in den _s“ enden).In diesem Fall wenn _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1 ist, dann muss eine kleine Änderung an den ursprünglichen Code vorgenommen werden:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
...
char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
Nur der Name der Funktion muss geändert werden (durch das Hinzufügen von „_s“); Vorlagen werden Überladung sich um Bereitstellen von Größen arguments.
Standardmäßig werden _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES und _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT definiert, wie 0 (deaktiviert) und _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES wird definiert als 1 (aktiviert).
Beachten Sie, dass diese Vorlagen Überladungen nur für statische Arrays arbeiten.Dynamisch zugeordnete Puffer benötigen zusätzliche Änderungen am Quellcode.Die oben aufgeführten Beispiele erneut aufzurufen:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
...
char *szBuf = (char*)malloc(10);
strcpy(szBuf, "test"); // still deprecated; have to change to
// strcpy_s(szBuf, 10, "test");
Und dies:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
...
char *szBuf = (char*)malloc(10);
strcpy_s(szBuf, "test"); // doesn't compile; have to change to
// strcpy_s(szBuf, 10, "test");