Che cos’è un overflow di numeri interi?

L’overflow di numeri interi si riferisce al fenomeno che si verifica in alcuni tipi di dati del computer in cui i loro segni passano da positivo a negativo, o viceversa, quando raggiungono le estremità dei loro intervalli applicabili. Negli intervalli di computer, i tipi di dati interi hanno intervalli circolari e quando raggiungono un’estremità dell’intervallo, si spostano immediatamente all’altra estremità dell’intervallo. Questo è anche chiamato overflow intero.

Un intero con segno può contenere un intervallo di valori da -231 a (231) – 1. Questo intero non può avere un valore di (-231) – 1; piuttosto, il numero successivo a cui aumenta si trova all’altra estremità del suo intervallo: (231 – 1). Il cambiamento da negativo a positivo alla fine del suo intervallo è un esempio di integer overflow. Allo stesso modo, un numero intero non può avere un valore di 231; questo valore passerebbe invece all’altra estremità del suo intervallo e diventerebbe -231.

Questo overflow ha conseguenze significative durante la programmazione. Un array può contenere solo tanti indici quanti ne consente il tipo intero e gli indici negativi non contano. Se un programmatore tenta di creare un array più grande di quanto consentito dal tipo intero, possono verificarsi errori di memoria significativi perché l’overflow dei numeri interi comporterebbe un indice negativo. Questo è particolarmente pericoloso nei linguaggi che non hanno limiti espliciti che controllano gli array, come il C++.

Quando si verifica un overflow di numeri interi, possono verificarsi tipi di overflow correlati come buffer overflow, heap overflow e stack buffer overflow. In tutti questi casi, l’integer overflow agisce per sopraffare le strutture di memoria con più dati di quanti tali strutture possano concepibilmente contenere. Questi overflow, in programmi semplici, spesso non fanno molto di più che causare un errore di lettura o scrittura non valido. La manipolazione di questo problema da parte degli hacker, tuttavia, può ingegnerizzare errori di memoria che possono causare problemi più seri.

Nella maggior parte dei programmi semplici, l’overflow di numeri interi non è un grosso problema. I limiti del tipo intero sono sufficientemente grandi da non far entrare in gioco il problema dell’overflow a meno che non vengano gestiti molti dati contemporaneamente. In alcuni casi l’overflow può essere mitigato, come nel caso dei contatori incrementali, utilizzando un tipo di dati più grande con un intervallo maggiore. Il tipo di dati più grande potrebbe, in teoria, incontrare lo stesso problema di overflow, ma man mano che gli intervalli di tipi di dati diventano più grandi, le possibilità di farlo diminuiscono. L’intervallo di ogni tipo di dati intero è almeno il doppio della dimensione del successivo più piccolo, quindi c’è ampio spazio per dati aggiuntivi.