Határellenőrzés - Bounds checking

A számítógép-programozás , határoló ellenőrzés bármely módszerhez észlelni, hogy a változó belül néhány határokat használat előtt. Általában annak biztosítására szolgál, hogy egy szám illeszkedjen egy adott típusba (tartományellenőrzés), vagy hogy egy tömbindexként használt változó a tömb határain belül legyen (indexellenőrzés). A sikertelen határokat ellenőrizni általában azt eredményezi, a generációs valamiféle kivétel jelet.

Mivel a határellenőrzés minden használat során időigényes, nem mindig történik meg. A határellenőrzés kiküszöbölése egy fordító optimalizálási technika, amely kiküszöböli a szükségtelen határellenőrzést.

Hatótávolság ellenőrzése

A hatótávolság-ellenőrzés annak ellenőrzése, hogy egy szám egy bizonyos tartományon belül van-e; például annak biztosítására, hogy egy 16 bites egész számhoz hozzárendelendő érték a 16 bites egész szám kapacitását meghaladja (azaz ellenőrizze a körbefutást ). Ez nem teljesen azonos a típusellenőrzéssel . Más hatótávolság-ellenőrzések korlátozóbbak lehetnek; például egy naptári hónap számának megtartására szolgáló változó deklarálható, hogy csak az 1 és 12 közötti tartományt fogadja el.

Indexellenőrzés

Az indexellenőrzés azt jelenti, hogy minden tömböt indexelő kifejezésben az index értékét a tömb határaival (amelyeket a tömb definiálásakor hoztak létre) ellenőriztetünk, és ha az index határon kívül van, akkor a további végrehajtást a valamiféle hiba. Mivel egy tömb határain kívüli érték elolvasása vagy különösen írása a program meghibásodását vagy összeomlását okozhatja, vagy engedélyezheti a biztonsági réseket (lásd a puffertúlcsordulást ), az indexellenőrzés sok magas szintű nyelv része .

A Pascal, a Fortran és a Java indexellenőrző képességgel rendelkezik. A VAX számítógép rendelkezik egy INDEX összeszerelési utasítással a tömbindexek ellenőrzésére, amely hat operandust vesz igénybe, amelyek mindegyike bármilyen VAX címzési módot használhat. A B6500 és hasonló Burroughs számítógépek hardveren keresztül végeztek kötött ellenőrzést, függetlenül attól, hogy melyik számítógép nyelvét állították össze a gépi kód előállításához. Korlátozott számú későbbi CPU rendelkezik speciális utasításokkal a határok ellenőrzésére, például a Motorola 68000 sorozat CHK2 utasításával .

Számos programozási nyelv , például a C , soha nem hajt végre automatikus határellenőrzést a sebesség növelése érdekében. Ez azonban sok külön -külön hibát és a puffertúlcsordulást el nem fogva hagy. Sok programozó úgy véli, hogy ezek a nyelvek túl sokat áldoznak a gyors végrehajtás érdekében. 1980-ban a Turing-díjjal tartott előadásában a CAR Hoare leírta tapasztalatait az ALGOL 60 , a határellenőrzést is magában foglaló nyelv tervezésében , mondván:

Ennek az elvnek az a következménye, hogy minden egyes indexelt változó minden indexének minden előfordulását minden alkalommal futás közben ellenőrizték a tömb felső és alsó deklarált határaival szemben. Sok évvel később megkérdeztük ügyfeleinket, hogy kívánják-e, hogy nyújtsunk lehetőséget az ellenőrzések kikapcsolására a termelés hatékonysága érdekében. Egyhangúlag arra szólítottak fel bennünket, hogy ne tegyük - ők már tudták, milyen gyakran fordulnak elő indexelési hibák olyan gyártási futtatások során, ahol a felderítés elmulasztása katasztrofális lehet. Félve és rémülten veszem tudomásul, hogy még 1980-ban sem a nyelvtervezők és a felhasználók megtanulták ezt a leckét. Bármelyik tekintélyes mérnöki ágban az ilyen alapvető óvintézkedések be nem tartása régen törvényellenes lett volna.

A futtatási idő ellenőrzését kikényszerítő mainstream nyelvek közé tartozik az Ada , a C # , a Haskell , a Java , a JavaScript , a Lisp , a PHP , a Python , a Ruby és a Visual Basic . A D és OCaml nyelvek futási időkorlátokkal rendelkeznek, amelyek engedélyezve vagy letiltva vannak egy fordító kapcsolóval. A C ++ futási idő ellenőrzés nem része a nyelvnek, hanem része a STL és engedélyezve van egy fordítási kapcsolót (_GLIBCXX_DEBUG = 1 vagy _LIBCPP_DEBUG = 1). A C # nem biztonságos régiókat is támogat : olyan kódrészek, amelyek (többek között) ideiglenesen felfüggesztik a határellenőrzést a hatékonyság növelése érdekében. Ezek hasznosak az idő kritikus szűk keresztmetszeteinek felgyorsításához anélkül, hogy egy egész program biztonságát feláldoznák.

A JS ++ programozási nyelv létező típusok használatával képes elemezni, hogy egy tömbindex vagy térképkulcs nem lép-e túl a fordítás idején , ez egy névleges típus, amely leírja, hogy az index vagy a kulcs határon belüli vagy határon kívüli, és irányítja a kódgenerálást. Kimutatták, hogy a létező típusok csak 1 ms általános költséget adnak a fordítási időkhöz.

A hardver határainak ellenőrzése

A határellenőrzéssel járó biztonság szükségszerűen a CPU idejébe kerül, ha az ellenőrzést szoftverben végzik; ha azonban az ellenőrzéseket hardverrel lehetne elvégezni, akkor a biztonságot "ingyen" biztosíthatjuk, futásidejű költségek nélkül. Az ICL 2900 sorozatú nagygép 1974-ben jelent meg egy korai hardverkorlát-ellenőrző rendszerrel. Legalább 2005 óta folynak a kutatások az x86 beépített virtuális memóriakezelő egységének a tömb- és a pufferelérések biztonságának biztosítására szolgáló módszereivel kapcsolatban. 2015-ben az Intel Skylake processzorarchitektúrájában biztosította Intel MPX kiterjesztéseit, amelyek korlátokat tárolnak a CPU regiszterben és a táblában a memóriában. 2017 elejétől legalább a GCC támogatja az MPX kiterjesztéseket.

Lásd még

Hivatkozások

Külső linkek