Kas yra sveikųjų skaičių perpildymas?

Sveikųjų skaičių perpildymas reiškia reiškinį, atsirandantį tam tikruose kompiuterių duomenų tipuose, kai jų ženklai pasikeičia iš teigiamų į neigiamus arba atvirkščiai, kai pasiekia taikomų diapazonų galus. Kompiuterių diapazonuose sveikųjų skaičių duomenų tipai turi apskritus diapazonus, o pasiekę vieną diapazono galą iš karto pereina į kitą diapazono galą. Tai taip pat vadinama sveikojo skaičiaus perpildymu.

Sveikasis skaičius su ženklu gali turėti reikšmių diapazoną nuo –231 iki (231) – 1. Šio sveikojo skaičiaus reikšmė negali būti (-231) – 1; greičiau kitas skaičius, iki kurio jis didėja, yra kitame diapazono gale: (231 – 1). Pokytis iš neigiamo į teigiamą jo diapazono pabaigoje yra sveikojo skaičiaus perpildymo pavyzdys. Tuo pačiu būdu sveikasis skaičius negali turėti 231; vietoj to ši vertė persijungs į kitą diapazono galą ir taps -231.

Šis perpildymas turi reikšmingų pasekmių programuojant. Masyve gali būti tik tiek indeksų, kiek leidžia sveikojo skaičiaus tipas, o neigiami indeksai neskaičiuojami. Jei programuotojas bando sukurti didesnį, nei leidžia sveikojo skaičiaus tipas, masyvą, gali atsirasti didelių atminties klaidų, nes sveikojo skaičiaus perpildymas sukeltų neigiamą indeksą. Tai ypač pavojinga kalbomis, kuriose nėra aiškių masyvų tikrinimo ribų, pvz., C++.

Kai įvyksta sveikojo skaičiaus perpildymas, gali atsirasti susijusių tipų perpildymo, pvz., buferio perpildymo, krūvos perpildymo ir dėklo buferio perpildymo. Visais šiais atvejais sveikųjų skaičių perpildymas perpildo atminties struktūras daugiau duomenų, nei tose struktūrose gali tilpti. Šie perpildymai paprastose programose dažnai neduoda daugiau, nei sukelia netinkamą skaitymo arba neteisingo rašymo klaidą. Tačiau įsilaužėliams manipuliuojant šia problema, gali atsirasti atminties klaidų, kurios gali sukelti rimtesnių problemų.

Daugumoje paprastų programų sveikųjų skaičių perpildymas nėra didelė problema. Sveikojo skaičiaus tipo ribos yra pakankamai didelės, kad perpildymo problema neatsirastų, nebent vienu metu tvarkoma daug duomenų. Kai kuriais atvejais perpildymas gali būti sumažintas, kaip ir didėjančių skaitiklių atveju, naudojant didesnį duomenų tipą su didesniu diapazonu. Teoriškai didesnio tipo duomenų tipai galiausiai gali susidurti su ta pačia perpildymo problema, tačiau didėjant duomenų tipų diapazonams, tikimybė tai padaryti mažėja. Kiekvieno sveikojo skaičiaus duomenų tipo diapazonas yra bent du kartus didesnis už kitą mažiausią, todėl yra pakankamai vietos papildomiems duomenims.