Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Mnoho starých funkcí CRT má novější, bezpečnější verze. Pokud existuje zabezpečená funkce, starší, méně zabezpečená verze se označí jako zastaralá. Nová verze má příponu _s
("secure").
V tomto kontextu "zastaralé" znamená, že použití funkce se nedoporučuje. Neznamená to, že funkce bude odebrána z CRT.
Zabezpečené funkce nezabrání nebo opraví chyby zabezpečení. Místo toho zachytí chyby, když dojde k jejich výskytu. Provádějí dodatečné kontroly chybových podmínek. Pokud dojde k chybě, vyvolají obslužnou rutinu chyby (viz Ověřování parametrů).
Funkce strcpy
například nemůže zjistit, jestli je řetězec, který kopíruje, příliš velký pro cílovou vyrovnávací paměť. Jeho zabezpečený protějšek strcpy_s
přijímá velikost vyrovnávací paměti jako parametr. Může tedy určit, jestli dojde k přetečení vyrovnávací paměti. Pokud použijete strcpy_s
ke zkopírování 11 znaků do vyrovnávací paměti o velikosti 10 znaků, je to vaše chyba; strcpy_s
nemůže opravit vaši chybu. Ale může zjistit vaši chybu a informovat vás vyvoláním obslužné rutiny pro neplatné parametry.
Odstranění upozornění na zastarání
Existuje několik způsobů, jak eliminovat upozornění na vyřazení starších, méně zabezpečených funkcí. Nejjednodušší je jednoduše definovat _CRT_SECURE_NO_WARNINGS
nebo použít direktivu warning
pragma. Zakáže upozornění o vyřazení, ale problémy se zabezpečením, které způsobily tato upozornění, stále přetrvávají. Je lepší ponechat upozornění na zastaralé funkce povolená a využívat nové bezpečnostní prvky CRT.
V jazyce C++ je nejjednodušším způsobem, jak eliminovat upozornění na zastaralost, použít zabezpečená přetížení šablon. Přetížení odstraňují upozornění na zastaralost v mnoha případech. Nahrazují volání zastaralých funkcí voláními zabezpečených verzí funkcí. Zvažte například toto zastaralé volání strcpy
:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
Definování _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
jako 1 eliminuje upozornění změnou strcpy
volání na strcpy_s
, což brání přetečení vyrovnávací paměti. Další informace naleznete v tématu Přetížení šablon zabezpečení.
U zastaralých funkcí bez přetížení zabezpečených šablon byste měli určitě zvážit ruční aktualizaci kódu tak, aby používal zabezpečené verze.
Dalším zdrojem upozornění na zastaralost, nesouvisející se zabezpečením, jsou funkce systému POSIX. Názvy funkcí POSIX nahraďte jejich standardními ekvivalenty (například změnou access
na _access
) nebo zakažte upozornění vyřazení související s POSIX definováním _CRT_NONSTDC_NO_WARNINGS
. Další informace naleznete v tématu Kompatibilita.
Další funkce zabezpečení
Mezi funkce zabezpečení patří:
Ověřování parametrů
Zabezpečené funkce a řada jejich nezabezpečených protějšků ověřuje parametry. Ověření může zahrnovat:
- Kontrola hodnot
NULL
. - Kontrola platnosti výčtových hodnot
- Kontrola, že celočíselné hodnoty jsou v platných rozsazích.
Další informace najdete v tématu Ověření parametru.
Obslužná rutina pro neplatné parametry je také přístupná pro vývojáře. Když funkce narazí na neplatný parametr, namísto uplatnění a ukončení aplikace, CRT umožňuje zkontrolovat tyto problémy prostřednictvím
_set_invalid_parameter_handler
nebo_set_thread_local_invalid_parameter_handler
.- Kontrola hodnot
Vyrovnávací paměti velikosti
Velikost vyrovnávací paměti musíte předat jakékoli zabezpečené funkci, která zapisuje do vyrovnávací paměti. Před zápisem do vyrovnávací paměti zabezpečené verze ověřují, že vyrovnávací paměť je dostatečně velká. Ověřování pomáhá vyhnout se nebezpečným chybám přetečení vyrovnávací paměti, které by mohly umožnit spuštění škodlivého kódu. Tyto funkce obvykle vrací kód chyby a vyvolají obslužnou rutinu pro neplatný parametr, pokud je velikost vyrovnávací paměti příliš malá. Funkce, které čtou ze vstupních vyrovnávacích pamětí, například
gets
mají zabezpečené verze, které vyžadují, abyste zadali maximální velikost.Ladicí verze některých funkcí CRT s rozšířeným zabezpečením vyplní vyrovnávací paměť předanou jim speciálním znakem (0xFE). Tento vyplňovací znak pomáhá najít případy, kdy byla funkci předána nesprávná velikost. Bohužel to také snižuje výkon. Chcete-li zvýšit výkon, použijte
_CrtSetDebugFillThreshold
k zakázání plnění vyrovnávací paměti. Další informace a seznam funkcí, které toto chování mají, naleznete v tématu_CrtSetDebugFillThreshold
.Ukončení nulovým znakem
Některé funkce, které mohly zanechávat řetězce neukončené, mají zabezpečené verze, které zajišťují, že řetězce jsou správně ukončeny nulovým znakem.
Vylepšené zasílání zpráv o chybách
Zabezpečené funkce vrací kódy chyb s více informacemi o chybách, než byly k dispozici u existujících funkcí. Zabezpečené funkce a řada existujících funkcí teď nastavují
errno
a často vrací také typ kóduerrno
, aby poskytovaly lepší hlášení chyb.Zabezpečení systému souborů
Zabezpečená rozhraní API pro vstupně-výstupní operace souborů podporují zabezpečený přístup k souborům ve výchozím případě.
Zabezpečení Windows
Zabezpečená rozhraní API procesu vynucují zásady zabezpečení a umožňují zadat seznamy ACL.
Kontrola syntaxe řetězce formátu
Neplatné řetězce jsou detekovány například při použití nesprávných znaků pole typu ve formátových řetězcích
printf
.
Viz také
Ověření parametru
Přetížení zabezpečených šablon
Soubory C runtime (CRT) a standardní knihovny C++ (STL) .lib