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
- „ A címkézett architektúra előnyeiről ”, IEEE tranzakciók számítógépeken, C-22. Kötet, 7. szám, 1973. július.
- „ A császár régi ruhái archiválódtak 2017-10-02-én a Wayback Machine-nél ”, az ACM 1980-as Turing-díjas előadása, CACM 24. kötet, 2. szám, 1981. február, 75–83.
- „ Bcc: Futásidejű ellenőrzés a C programok számára ”, Samuel C. Kendall, Az USENIX 1983. nyári konferenciájának anyagai .
- “ Bounds Checking for C ”, Richard Jones és Paul Kelly, Imperial College, 1995. július.
- „ ClearPath Enterprise Servers MCP biztonsági áttekintés ”, Unisys, 2006. április.
- „ Biztonságos virtuális architektúra: biztonságos végrehajtási környezet az árucikk operációs rendszerekhez ”, John Criswell, Andrew Lenharth, Dinakar Dhurjati, Vikram Adve, SOSP'07 21. ACM szimpózium az operációs rendszerek alapelveiről, 2007.
- „ Fail-Safe C ”, Yutaka Oiwa. A memóriabiztonságos teljes ANSI-C fordító megvalósítása. ACM SIGPLAN Konferencia a programozási nyelv tervezéséről és megvalósításáról (PLDI2009), 2009. június.
- „ Cím-fertőtlenítő ”, Timur Iskhodzhanov, Alexander Potapenko, Alexey Samsonov, Kostya Serebryany, Evgeniy Stepanov, Dmitriy Vyukov, LLVM Dev Meeting, 2011. november 18.
- Biztonságos, korlátozott API-k könyvtár
- Msgstr "A biztonságos C könyvtár" . Dr. Dobb's Journal . 2009. február 20. Az eredetiből 2013. december 2-án archiválva . Lap November 13-, 2012-es .
- Safe C API - A puffertúlcsordulás tömör megoldása, The OWASP Foundation, OWASP AppSec, Peking 2011
- A GNU C ++ könyvtár kézi makrói
- libc ++ 11.0 dokumentáció Hibakeresési mód