A sablon túlterhelésének biztonságossá tétele

A Microsoft számos C Futtatókörnyezeti kódtárat (CRT) elavulttá tett a biztonsági szempontból továbbfejlesztett verziók érdekében. Például a strcpy_s biztonságosabb csere a strcpy helyett. Az elavult függvények a biztonsági hibák gyakori forrásai, mivel nem akadályozzák meg a memóriát felülíró műveleteket. A fordító alapértelmezés szerint elavulással kapcsolatos figyelmeztetést ad elő, amikor az egyik függvényt használja. A CRT C++ sablon túlterheléseket biztosít ezekhez a függvényekhez, hogy megkönnyítse a biztonságosabb változatokra való áttérést.

Ez a kódrészlet például figyelmeztetést generál, mert strcpy elavult:

char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated

Az elavulással kapcsolatos figyelmeztetés arra figyelmezteti, hogy a kód nem biztonságos. Ha ellenőrizte, hogy a kód nem tudja felülírni a memóriát, több lehetősége is van. Figyelmen kívül hagyhatja a figyelmeztetést, megadhatja a jelet _CRT_SECURE_NO_WARNINGS a CRT-fejlécek belefoglalási utasításai előtt a figyelmeztetés mellőzéséhez, vagy frissítheti a kódot a következőre strcpy_s:

char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function

A sablon túlterhelései további lehetőségeket biztosítanak. Ha a(z) _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES értékét 1-re állítja, az lehetővé teszi a szabványos CRT-függvények sablontúlterhelési lehetőségét, amelyek automatikusan meghívják a biztonságosabb változatokat. Ha _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1, akkor nincs szükség a kód módosítására. A színfalak mögött a strcpy hívást egy automatikusan megadott méretargumentummal történő strcpy_s hívássá módosítják.

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

// ...

char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")

A(z) _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES makró nem befolyásolja azokat a függvényeket, amelyek számlálást végeznek, például strncpy. A sablon túlterhelésének engedélyezéséhez állítsa _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT értékét 1-re. Előtte azonban győződjön meg arról, hogy a kód a karakterek számát adja át, nem pedig a puffer méretét (gyakori hiba). Emellett a függvényhívás után a puffer végén explicit módon null terminátort író kód szükségtelen, ha a biztonságos variánst meghívják. Ha szüksége van a csonkolási viselkedésre, tekintse meg _TRUNCATE.

Megjegyzés:

A(z) _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT makró megköveteli, hogy a(z) _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES is 1-re legyen definiálva. Ha _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1-ként van definiálva, és _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 0-ként van definiálva, az alkalmazás nem hajt végre sablontúlterhelést.

Amikor a _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES értékét 1-re állítja, lehetővé teszi a sablonok túlterhelését a biztonságos változatoknál (amelyek neve "_s"-sel végződik). Ebben az esetben, ha _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1, akkor egy kis módosítást kell végrehajtani az eredeti kódon:

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

// ...

char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")

Csak a függvény nevét kell módosítani (a "_s" hozzáadásával); A sablon túlterhelése gondoskodik a méretargumentum megadásáról.

Alapértelmezés szerint _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 0 (letiltva) _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES és 1 -ként van definiálva (engedélyezve).

A sablon túlterhelése csak statikus tömbök esetén működik. A dinamikusan lefoglalt pufferek más forráskódmódosításokat igényelnek. A fenti példák újrafelfedezése:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

// ...

char *szBuf = (char*)malloc(10);
strcpy(szBuf, "test"); // still deprecated; change it to
                       // strcpy_s(szBuf, 10, "test");

És ez a példa:

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

// ...

char *szBuf = (char*)malloc(10);
strcpy_s(szBuf, "test"); // doesn't compile; change it to
                         // strcpy_s(szBuf, 10, "test");

Lásd még

Biztonsági funkciók a CRT-ben
C futtatókörnyezeti (CRT) és C++ Standard Könyvtár (STL) .lib fájlok