La funzione deterministica mostra un comportamento indeterminato, com'è possibile?

-3

Come può un bug verificarsi su dati di input statici e fissi solo "a volte"? Quello che segue è semplicemente un esempio che ho osservato, ma non mi interessa una risposta specifica per la libreria GD.

Ho un codice PHP per il rendering di file SVG, utilizzando la libreria GD Graphics. Spesso smette di funzionare e non viene segnalato alcun errore. La cosa strana è che dopo 2-3 tentativi funziona e continua a lavorare senza modifiche al codice. Questo è molto strano per me perché capisco che il codice assemblato segue in ordine sequenziale e opera su determinati input esterni. In questo caso, l'input conosciuto è un file statico.

La mia domanda è: com'è possibile (da un punto di vista generale, teorico)? Cosa potrebbe fare la libreria GD (o qualsiasi altro codice) per causare un comportamento così irregolare? In che modo il codice può funzionare in modo diverso in base a quante volte è stato eseguito, se l'input è rimasto lo stesso?

    
posta user1122069 29.12.2015 - 02:39
fonte

1 risposta

4

Quando ti capisco correttamente, la tua domanda non è specificatamente su GD, ma come in generale una funzione con requisiti completamente deterministici può mostrare un comportamento non deterministico: dato esattamente lo stesso input, l'output (o in questo caso il comportamento) è diverso, anche se non esiste una causa ovvia come un generatore di clock o un generatore casuale.

Ogni volta che esegui un programma o una funzione su un sistema, anche quando il codice viene eseguito in un processo separato, non viene mai eseguito in perfetto isolamento: c'è sempre un ambiente intorno ad esso, molti altri processi che si svolgono contemporaneamente stessa macchina. Ci sono sempre risorse condivise come la memoria principale, lo spazio su disco, i core del processore, la memoria della scheda gfx, le variabili di ambiente globali e così via, che non sono prevedibili esattamente nello stesso stato quando si esegue il programma due volte in momenti diversi. Solo questo può essere la causa del comportamento non deterministico che stai osservando.

Inoltre, GD è scritto in C, che è un linguaggio in cui è possibile creare un "comportamento indefinito" in diversi modi. Ad esempio, questo può accadere accidentalmente dimenticando di inizializzare una variabile prima dell'uso (non che questo sia veramente il caso di GD, prendilo come uno scenario ipotetico). Ciò rende possibile che il valore di una variabile possa dipendere dallo stato delle risorse condivise che ho menzionato sopra. E supponendo che la lib di GD contenga un pezzo di codice in qualche parte nel codice di rendering di SVG, o nel suo binding di PHP, allora posso immaginare che potrebbe portare esattamente al comportamento che hai descritto.

    
risposta data 29.12.2015 - 08:34
fonte

Leggi altre domande sui tag