Kontrola mezí - Bounds checking

V programování počítače , ohraničuje kontrola je nějaký způsob zjišťování, zda proměnná je v některých hranicích před tím, než je použit. Obvykle se používá k zajištění toho, že číslo zapadá do daného typu (kontrola rozsahu), nebo že proměnná používaná jako index pole je v mezích pole (kontrola indexu). Neúspěšná kontrola hranice má obvykle za následek generování nějakého druhu signálu výjimky .

Protože provádění hraničních kontrol při každém použití je časově náročné, není to vždy hotové. Vyloučení kontroly hranic je technika optimalizace kompilátoru, která eliminuje nepotřebnou kontrolu hranic.

Kontrola dosahu

Kontrola rozsahu je kontrola, která zajistí, že číslo je v určitém rozsahu; například zajistit, aby hodnota, která má být přiřazena 16bitovému celému číslu, byla v rámci kapacity 16bitového celého čísla (tj. kontrola proti zalomení ). To není úplně stejné jako kontrola typu . Jiné kontroly dosahu mohou být přísnější; například proměnná, která obsahuje číslo kalendářního měsíce, může být deklarována tak, aby přijímala pouze rozsah 1 až 12.

Kontrola indexu

Kontrola indexu znamená, že ve všech výrazech indexujících pole je hodnota indexu zkontrolována proti hranicím pole (které byly vytvořeny při definování pole), a pokud je index mimo hranice, další provádění je pozastaveno prostřednictvím nějaká chyba. Protože čtení nebo zejména zápis hodnoty mimo hranice pole může způsobit nesprávnou funkci nebo selhání programu nebo povolit chyby zabezpečení (viz přetečení vyrovnávací paměti ), je kontrola indexu součástí mnoha jazyků na vysoké úrovni .

Pascal, Fortran a Java mají schopnost kontroly indexu. Počítač VAX má instrukci sestavy INDEX pro kontrolu indexu pole, která vyžaduje šest operandů, přičemž všechny mohou používat jakýkoli režim adresování VAX. Počítače B6500 a podobné počítače Burroughs prováděly vázanou kontrolu pomocí hardwaru, bez ohledu na to, který počítačový jazyk byl sestaven pro vytvoření strojového kódu. Omezený počet novějších procesorů má speciální instrukce pro kontrolu hranic, např. Instrukce CHK2 na řadě Motorola 68000 .

Mnoho programovacích jazyků , například C , nikdy neprovádí automatickou kontrolu hranic, aby zvýšila rychlost. To však ponechává mnoho chyb typu off-by-one a přetečení vyrovnávací paměti nezachyceno. Mnoho programátorů věří, že se tyto jazyky příliš obětují pro rychlé provedení. Na své přednášce Turing Award z roku 1980 popsal CAR Hoare své zkušenosti s designem ALGOL 60 , jazyka, který zahrnoval kontrolu hranic, slovy:

Důsledkem tohoto principu je, že každý výskyt každého dolního indexu každé dolní indexované proměnné byl při každé příležitosti zkontrolován za běhu proti horní i dolní deklarované hranici pole. O mnoho let později jsme se zeptali našich zákazníků, zda si přejí, abychom poskytli možnost vypnout tyto kontroly v zájmu efektivity výrobních sérií. Jednomyslně na nás naléhali, abychom to neudělali - už věděli, jak často se v produkčních sériích vyskytují chyby dolního indexu, kde by jejich detekce mohla být katastrofální. Se strachem a hrůzou poznamenávám, že ani v roce 1980 se jazykové designéry a uživatelé tuto lekci nepoučili. V každém váženém odvětví strojírenství by nedodržování těchto základních opatření bylo již dlouho v rozporu se zákonem.

Mezi běžné jazyky, které vynucují kontrolu běhu, patří Ada , C # , Haskell , Java , JavaScript , Lisp , PHP , Python , Ruby a Visual Basic . Mezi D a OCaml jazyky běžet čas kontrolou hranic, která je povoleno nebo zakázáno pomocí přepínače kompilátoru. V C ++ není doba běhu součástí jazyka, ale součástí STL a je povolena přepínačem kompilátoru (_GLIBCXX_DEBUG = 1 nebo _LIBCPP_DEBUG = 1). C # také podporuje nebezpečné oblasti : části kódu, které (mimo jiné) dočasně pozastaví kontrolu hranic pro zvýšení efektivity. Jsou užitečné pro zrychlení malých časově kritických úzkých míst, aniž by byla obětována bezpečnost celého programu.

JS ++ programovací jazyk je schopen analyzovat, zda index pole nebo mapu Klíčem k úspěchu je out-of-hranice v době kompilace pomocí neexistující typy , což je nominální typu popisující, zda index nebo klíč je v zámezí, nebo out-of-hranice a průvodce generováním kódu. Ukázalo se, že existující typy přidávají pouze 1 ms režii ke kompilaci.

Kontrola mezí hardwaru

Zabezpečení přidané kontrolou hranic nutně stojí čas CPU, pokud je kontrola prováděna v softwaru; pokud by však kontroly mohly být prováděny hardwarem, pak lze bezpečnost poskytnout „zdarma“ bez nákladů na běh programu. Prvním systémem s kontrolou hardwarových mezí byl sálové počítače ICL 2900 Series oznámené v roce 1974. Výzkum probíhá nejméně od roku 2005, pokud jde o metody použití integrované jednotky pro správu virtuální paměti x86 k zajištění bezpečnosti přístupu k poli a vyrovnávací paměti. V roce 2015 společnost Intel poskytla rozšíření Intel MPX ve své architektuře procesoru Skylake, která ukládá meze v registru CPU a tabulce v paměti. Počátkem roku 2017 alespoň GCC podporuje rozšíření MPX.

Viz také

Reference

externí odkazy