Franny's Adobe

Il blog di Francesco Carucci
posts - 99, comments - 948, trackbacks - 6705

lunedì 26 maggio 2008

Un'analisi informale dei crash bug in C++

Il mio lavoro si e' trasformato nelle ultime settimane (mesi) nell'analisi e (possibilmente) nel fix dei bug nell'engine in ingresso nel database di Fable 2. Ogni giorno ho qualche decina di bug da guardare, se riesco risolvere al momento, oppure indirizzare verso chi di dovere.

Vuol dire in parole povere che ne ho viste parecchie.

L'engine consiste in qualche centinaia di migliaia di righe di codice, divise fra una decina di programmatori nel corso di tre anni.

Da questo lavoro di analisi ho potuto farmi un'idea molto informale (nel senso che non ho raccolto dati precisi) sulle cause dei crash bug in Fable 2, e sul codice che li genera. La stragrande maggioranza dei crash bug e' dovuta a problemi con la gestione del ciclo di vita di un oggetto, quando e' allocato, sopratutto quando, come e dove e' deallocato. I double delete sono all'ordine del giorno. Peggio ancora mantenere reference a oggetti che sono stati deallocati da qualcun altro e scriverci sopra, che equivale a scrivere sopra un oggetto casuale in un qualsiasi pezzo di codice nel sistema che si e' trovato ad usare quel pezzo di memoria deallocato. Crash random e problema difficilissimo da diagnosticare, perche' la causa non e' locale.

Piccole regolette che aiutano molto a prevenire anziche' curare:

- Resource Allocation Is Initalisation, sempre e comunque

- Azzerare un puntatore dopo il delete

- Usare smart pointer dove possibile (ma occhio ai problemi con il ref counting)

- Notificare ai client la distruzione di un oggetto, possibilmente attraverso Observer (ma occhio alle complicazioni di design che ne derivano)

- Fare le cose semplici

 

L'ultimo sembra un consiglio stupido, ma e' forse l'unico importante: sono tre anni che predico di fare le cose semplici, e io ho cercato di seguire il mio consiglio il piu' possibile, senza complicarmi la vita, non scrivendo mai nulla che non fosse espressamente richiesto, cercando di scrivere codice piu' leggibile possibile. L'ultimo crash bug nel mio codice risale a quattro mesi fa (un doppio delete). Funziona.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (6) |

Powered by:
Powered By Subtext Powered By ASP.NET