Overflow intero 32 bit, aggiungi 1 e il massimo diventa negativo
Testo scritto con l’intelligenza artificiale a partire da una fonte citata, senza revisione umana prima della pubblicazione.
Un calcolo che supera 2.147.483.647 può avvolgere il valore a -2.147.483.648 invece di generare un errore, con effetti silenziosi su contatori e totali.
Aggiungi 1 a 2.147.483.647 e ottieni -2.147.483.648. Il contatore non esplode, si avvolge dall’altra parte. Nessun errore, solo un numero sbagliato che sembra valido1.
Questo è un overflow intero: il risultato supera la capacità del tipo che lo contiene. Molti ambienti non segnalano: il valore cambia segno e riparte dal limite opposto. Con gli interi con segno a 32 bit, 2.147.483.647 più 1 produce -2.147.483.6481. Il problema spesso resta invisibile. Un totale, un ID o un contatore possono diventare negativi o azzerarsi senza allarmi, e la logica applicativa continua come se nulla fosse1.
Un canale RGB impostato a 255 e incrementato di 1 torna a 0, con l’effetto di invertire il colore rispetto all’atteso1. Un totale registrato in una colonna smallint di un database, superata la soglia, diventa negativo dopo 32.767, perché oltre quella cifra il tipo non può rappresentare il valore in modo corretto1. Anche l’operazione di negazione può ingannare: negare -2.147.483.648 non produce il corrispettivo positivo, perché quel valore non entra nel formato, e l’overflow riporta lo stesso numero1.
I confini dei tipi interi sono fissi e noti. I bug da overflow sono tra i più prevedibili e costano poco da trovare quando si sa dove guardare1. Basta sapere quale tipo siede dietro un campo e colpire i limiti con dati mirati.
I confini utili da controllare ricorrono. Per i signed a 8 bit: 127 e 128. Per gli unsigned a 8 bit: 255 e 256, come nei canali colore. Per i signed a 16 bit: 32.767 e 32.768. Per gli unsigned a 16 bit: 65.535 e 65.536, ad esempio per i numeri di porta. Per i signed a 32 bit: 2.147.483.647 e 2.147.483.6481. Ogni coppia chiede tre prove: appena sotto, esattamente al limite, appena sopra.
Individua il tipo intero usato da ciascun campo. Prova i dati un soffio prima e un soffio dopo ogni soglia. Verifica il valore esatto sulla soglia, perché è frequente provarne solo uno oltre e saltare quello valido, che può avere logiche di convalida diverse1. Ripeti l’esperimento su tutti i layer. Un valore memorizzato come unsigned può diventare negativo se un altro componente lo legge come signed, con effetti difficili da rintracciare a posteriori1.
Il comportamento dipende dal linguaggio. Alcuni ambienti fanno il wrap in silenzio. Altri sollevano un’eccezione quando superi il limite. Python gestisce gli interi in modo trasparente e cresce la precisione al bisogno, quindi non presenta overflow sugli interi nativi1. Verifica l’aspettativa per ogni sistema prima di scrivere test e controlli.
Non dare per scontato che l’overflow annunci il problema. Molti linguaggi non avvertono. La prevenzione passa dal design dei casi di test e dalla mappatura dei tipi effettivi, campo per campo1.
Fonti
Come è nato questo articolo Scritto da un sistema di intelligenza artificiale, con controlli automatici
Millebit non ha giornalisti che scrivono gli articoli: li scrive un motore editoriale basato su modelli di intelligenza artificiale, a partire dalle fonti elencate qui sopra. Prima di uscire, ogni testo passa questi controlli:
- Rilettura. Un passaggio toglie i tic della prosa generata da un modello, come i contrasti costruiti e le frasi che annunciano invece di informare, senza toccare fatti e fonti.
- Fedeltà alle fonti. Un passaggio dedicato toglie ogni affermazione che le fonti non sostengono. Valutazione su questo pezzo: 10/10.
- Anti-cliché. Un filtro scarta frasi fatte, enfasi e tic della prosa artificiale: superato.
- Giudizio editoriale. Un modello valuta il pezzo su sette criteri (apertura, chiarezza, economia, concretezza, voce, struttura, fedeltà) e sotto 7,8/10 non si pubblica. Questo articolo ha preso 8,5/10 dopo 2 revisioni.
I controlli riducono gli errori ma non li eliminano: un modello può fraintendere una fonte. Per le decisioni importanti, risali alla fonte originale. Se trovi un errore, segnalacelo.
Per vedere Millebit nelle notizie principali di Google, aggiungilo alle tue fonti preferite. Oppure segui l’edizione di oggi, il feed RSS o La Sintesi.