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.
Jedním ze způsobů, jak minimalizovat problémy se zabezpečením, je zabránit přetečení a podtečení integerů.
K přetečení celého čísla dochází, když je výsledek aritmetické operace větší, než jaký je paměťový prostor datového typu určeného pro jeho příjem. Výsledkem této operace je zkrácení celého čísla a nesprávný výsledek. Pokud například přidáte dvě 32bitová celá čísla, která mají za následek hodnotu větší než
2^31-1, výsledek se zkrátí tak, aby se vešl do 32bitového celočíselného prostoru, což může vést k neočekávanému chování v kódu.Integer underflow nastane, když operace, obvykle odčítání, vede k nesprávnému výsledku. Pokud například odečtete číslo od INT_MIN (nejmenší hodnota pro 32bitové celé číslo se znaky), výsledek se zkrátí tak, aby se vešl do 32bitového celočíselného prostoru, což může také vést k neočekávanému chování.
Přetypování mezi dvěma datovými typy může také způsobit nesprávné výsledky kvůli zkrácení výsledku, který nevejde do nového místa v paměti.
Knihovna ntintsafe poskytuje sadu funkcí jazyka C, které provádějí bezpečné celočíselné aritmetické operace s kontrolou hranic, aby se zabránilo přetečení a podtečení v kódu v režimu jádra. Všechny funkce jsou v souboru záhlaví ntintsafe.h, který je součástí sady Windows Driver Kit (WDK). Tyto funkce odpovídají funkcím Windows IntSafe, které používá aplikační kód.
Tyto funkce slouží k výpočtu velikosti indexu nebo vyrovnávací paměti nebo k výpočtu jiné formy kontroly hranic. Funkce jsou optimalizované pro rychlost.
Bezpečné celočíselné funkce nabízejí následující výhody:
Velikost cílové vyrovnávací paměti je vždy předána funkci, aby se zajistilo, že funkce nezapisuje za konec vyrovnávací paměti.
Vyrovnávací paměti se zaručují, že budou ukončeny hodnotou null, i když operace zkrátí zamýšlený výsledek.
Všechny funkce vrací NTSTATUS, pouze s jedním možným kódem úspěchu (STATUS_SUCCESS) a jednou možnou chybovou podmínkou (STATUS_INTEGER_OVERFLOW). Měl by například
NTSTATUS status = RtlIntSub(INT_MIN, 1, &result);vrátit výsledek = -2 147 483 649, ale toto číslo nemůže být reprezentováno v 32bitovém poli.resultMísto toho není definován astatusje STATUS_INTEGER_OVERFLOW, což je hodnota stavu vrácená k hlášení přetečení i podtečení.
Knihovna ntintsafe má dvě kategorie funkcí:
Převodní funkce – tyto funkce provádějí převody mezi dvěma datovými typy.
Aritmetické funkce – tyto funkce provádějí operace sčítání, odčítání a násobení pro každý datový typ.