Přetížení šablony zabezpečení
Mnoho funkcí CRT jste se namísto verze novější, rozšířené zabezpečení (například strcpy_s bezpečnější náhradu za strcpy).CRT poskytuje přetížení šablony k usnadnění přechodu k bezpečnější varianty.
Například tento kód generuje varování, protože strcpy je:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
Upozornění můžete ignorovat.Definujte symbol _CRT_SECURE_NO_WARNINGS potlačit varování nebo aktualizovat kód použití strcpy_s:
char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function
Přetížení šablony poskytují další možnosti.Definování _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 umožňuje přetížení šablonu o bezpečnější varianty volání automaticky standardní funkce CRT.Pokud _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES je 1, pak provádět žádné změny kódu.V pozadí volání strcpy bude změněn na volání strcpy_s s automaticky zadaný argument velikost.
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
...
char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESnemá vliv na funkce, které count, jako například strncpy.Chcete-li šablonu přetížení pro funkce count, definovat _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1.Před tím, však ujistěte, že váš kód předává počet znaků, velikost vyrovnávací paměti (Obvyklou chybou).Také kód, který po volání funkce je nutné, pokud se nazývá zabezpečené varianty explicitně zapíše null zakončení na konec vyrovnávací paměti.Potřebujete-li zkrácení chování, viz _TRUNCATE.
[!POZNÁMKA]
Makro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT vyžaduje, aby _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES také definována jako 1.Pokud _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT je definován jako 1 a _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES je definována jako 0, aplikace nebude provádět žádné šablony přetížení.
Definování _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1 umožňuje přetížení šablony zabezpečení varianty (názvy končící "_s").V tomto případě Pokud _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES je 1, pak jeden malá změna musí být provedena na původní kód:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
...
char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
Pouze název funkce, je nutné změnit (přidáním "_s"); přetížení šablony budou starat o poskytování argument velikost.
Ve výchozím nastavení _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES a _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT jsou definovány jako 0 (zakázáno) a _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES je definován jako 1 (povoleno).
Všimněte si, že tyto šablony přetížení funkční pouze pro statické pole.Dynamicky přidělené vyrovnávací paměti vyžadují další zdroje změny kódu.Opětovné návštěvy výše uvedené příklady:
#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");
A to:
#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");