This is an old revision of the document!
Integer overflow
Do integer overflow-a dolazi kada se pokuša pohraniti vrijednost u varijablu koja je veća od maksimalno dopuštene. Sve numeričke vrijednosti tokom izvođenja operacija u kojima su oni operandi sačuvane su u registrima. U današnje vrijeme to su najčešće 64 bitni registri.
Veličine riječi u asemblerskom jeziku: Byte (8 bitova) Word (2 bajta) Doubleword (4 bajta) Quadword (8 bajta)
Ovisno o jeziku, operacije velikim brojevima znaju biti implementirane stringom (npr. python) čime se izbjegava mogućnost integer overflowa.
Primjer:
Recimo da je varijabla a definirana kao byte. Byte ima 8 bitova, što znači da je u nju moguće upisati 2^8 (256) različitih vrijednosti:
- unsigned notaciji: [0, 255]
- signed notaciji : [-128, 127]
Najveća vrijednost koju ona može sadržati u sebi jest broj 1111 1111(2) S obzirom da su svi numerički operandi nalaze u registru (npr. 64 bitnom) zapis vrijednosti varijable a (recimo broj 255) u registru koji sadržu njenu vrijednost biti će : 00000…1111 1111(2) gdje je broj nula 64-8 = 56.
Kada bismo tom registru dodali vrijednost 1, zapis bi izgledao ovako: 0000….1 0000 0000(2), što bi značilo da se vrijednost varijable promijenilo u 0 umjesto 256, jer samo prvih 8 bitova označavaju raspon varijable a. Kada bi se taj registar dalje koristio za upcastanje (npr. prikaz riječi dword) njegova vrijednost bi bila 256.
Sličan princip vrijedi i za overflowanje cijelog registra, odnosno riječi veličine qword (8 bajtova, 64 bita). Sklopovlje za zbrajanje registara interno koristi tzv. carry flag (rflags/eflags/status registra) To znači da kada se registar preplavi (odnosno upiše vrijednost veća od 2^64) on ispravlja svoj sadržaj (odnosno prikazuje upisanu vrijednost % 2^64 gdje je % operacija modulo-ostatak) i postavlja postavlja carry flag. Kada bi se taj registar dalje koristio za operacije bile bi prikazane vrijednost manje od 2^64.