Un bug in produzione
Come un identificatore alfanumerico è stato scambiato per un numero in notazione scientifica, mandando offline un sito di e-commerce.
Oggi voglio raccontarvi un bug che si è rivelato inaspettatamente filosofico.
A prima vista, quale tipo di dato assegnereste a questi valori?
5818d70dd0bf050001777772
57d053eb6bc24300012b1cc0
582646933170e00001768588
La risposta più ovvia è che siano stringhe alfanumeriche. È vero per i primi due valori, mentre l’ultimo nasconde un caso limite piuttosto insolito.
Osserviamolo più attentamente:
582646933170e00001768588
L’identificatore generato casualmente è composto quasi interamente da cifre e contiene una sola lettera: e.
In matematica e in molti linguaggi di programmazione, e può introdurre la notazione scientifica. PHP, per esempio, interpreta questa espressione:
$value = 1e6; // 1000000
Immaginiamo ora che una funzione generica di conversione provi a dedurre il tipo dei nostri tre identificatori. Il risultato può sorprendere:
5818d70dd0bf050001777772 // string
57d053eb6bc24300012b1cc0 // string
582646933170e00001768588 // INF
Per puro caso, l’ultimo valore rispettava la sintassi di un numero enorme espresso in notazione scientifica. Di fronte all’overflow, PHP ha restituito INF invece di conservare l’identificatore come testo.
Quell’interpretazione inattesa ha innescato una catena di errori e alla fine ha mandato offline il sito di e-commerce. La lezione è semplice: gli identificatori sono identificatori, non numeri, e le conversioni automatiche sono pericolose nei punti di passaggio tra sistemi. L’episodio mi ha anche ricordato quanto sia importante testare valori che assomigliano ai casi più comuni senza coincidere davvero con essi.