Sto lavorando a un progetto di grandi dimensioni che in genere funziona correttamente, ma mostra problemi gravi una volta che le dimensioni dei dati di input superano alcune limitazioni.Come trovare (tutto) il numero intero di overflow in un programma C?
Questi problemi sono (sospetta) solo per intero con segno trabocca come questi:
int a, o;
// Initialize a and o
int x = (a+o) >> 1);
Ovviamente, una volta che la somma di A e O overflow (diventa più grande di 2^31-1), x non è più lunga la media di a e o.
Esiste un modo generico per trovare tutti questi integer overflow in un programma in esecuzione?
Sto pensando a uno strumento come Valgrind o un'estensione GDB che rompe ad ogni intera istruzione aritmetica, prende i parametri e confronta il risultato corretto (calcolato con un datatype di dimensioni maggiori o aritmetica di precisione arbitraria) con il risultato effettivo . Se i risultati sono diversi, dovrebbe emettere un avviso, attivare un'interruzione di debug o qualcosa del genere.
Lo so, come controllare una singola istruzione aritmetica per gli overflow (ad esempio, controllare il segno per le aggiunte), tuttavia a causa della grande quantità di codice, non è una soluzione praticabile per me per passare attraverso l'intero progetto e inserire controllo codice ovunque a mano.
So approssimativamente, qual è il limite per l'input dell'utente. Il problema con il lavoro attraverso il codice è che il progetto ha più di 200k linee (199k di esse non scritte da me) e temo che sarebbe praticamente impossibile controllarle a mano per codice soggetto a overflow. – ChrisM
@ChrisM - Se sei in una posizione in cui non ti puoi fidare di quel codice che qualcun altro ha scritto è corretto, probabilmente non dovresti usarlo. Dovrebbero essere in atto pratiche commerciali per gestire cose come questa (recensioni, test, ecc.). Se sei solo tu con questo codice e nessun altro in giro, avrai bisogno di passare un po 'di tempo a leggerlo comunque. – OrangeDog
Ok, è un peccato. Speravo solo che ci fosse un modo per trovare automaticamente le sezioni problematiche nel codice (probabilmente una dozzina o più). – ChrisM