User Tools

Site Tools


integer_overflow

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.

integer_overflow.1700066373.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki