Possiamo garantire che un programma non andrà mai male?


10

Abbiamo un sistema qui. Recentemente c'è un calcolo errato in uno dei numeri nel rapporto generato dal sistema. Attraverso la nostra esperienza, non abbiamo mai riscontrato problemi / errori in questo sistema per alcuni anni.

Poiché lo scrittore di questo sistema era già sparito, difficilmente possiamo tracciare i programmi. Ma abbiamo verificato i dati di input, l'impostazione e sono giusti.

Ora la mia domanda è: un programma per computer andrà improvvisamente storto senza alcun motivo logico? Se sbatto sul server, uno dei numeri calcolati dal computer diventerà un altro numero e il calcolo sarà errato?

Sono d'accordo che la mia idea sia piuttosto folle, ma voglio solo sapere, come possiamo sapere che il problema non è causato dal programma e dall'input, ma da alcuni altri fattori?

PS Questo sistema pazzo non ha log.


8
Uno dei moduli RAM nel mio PC aveva esattamente un bit di difetto, quindi un programma abbastanza sfortunato da usare quel bit poteva produrre un risultato sbagliato. L'esecuzione di memtest86 sul tuo computer potrebbe essere un modo semplice per escludere quel tipo di problema.
user281377

16
sì, cancellandolo
Steven A. Lowe il

6
Alcuni componenti hardware presentano effettivamente dei bug. È una testimonianza per i chipmaker del giorno che sono così pochi. Prima sospetterei il software.

C'è sempre una ragione logica per cui un programma non funziona. Uno slam è una ragione logica.
mouviciel,

2
Puoi avere una bomba statistica, un compilatore dannoso, un ram, un disco o un virus dannoso che può scrivere sul tuo ram o modificare il sistema operativo o il bug del sistema operativo o un bug in una libreria da qualche parte o il famoso bug di tipo merge, oppure ...
Giobbe

Risposte:


8

Direi di no!

In teoria la risposta è no, possiamo solo verificare: -

  • un numero limitato di ambienti.
  • un numero limitato di tempistiche.
  • un numero limitato di casi di test.

Questo è notevolmente inferiore al numero totale possibile di ambienti, tempi e casi che il programma può riscontrare nella sua vita. Inoltre, abbiamo una scarsa conoscenza del futuro se il programma deve far fronte all'inflazione del 10.000%, il programma dovrebbe far fronte a una nuova architettura a 31 bit super duper?

La teoria è supportata dall'esperienza che ho incontrato personalmente: -

  • Programmi che si interrompono quando vengono spostati in un'altra lingua. Verifica "MAGGIO" quando il mese era "MAI".
  • Programmi che non superano i test su una nuova versione del compilatore, un errore nella versione precedente in combinazione con un errore nel programma ha prodotto il risultato corretto.
  • Programmi interrotti su una nuova versione del sistema operativo. Quando Solaris aumenta il numero predefinito di voci della directory, SMALLINT restituito da ftok () restituisce sempre zero per il primo file nella directory.
  • programmi che si rompono perché era la prima volta che incontravano una particolare combinazione di input, che erano sia validi che inattesi e che non sarebbero mai stati testati: tassi di interesse negativi sui depositi, articoli a peso zero da spedire, articoli di così basso valore che IVA non calcolabile ecc. Ecc.

Dico di sì, con una disposizione: se hai un multi-threading. Mai sentito parlare di "Condizioni di gara".
mattnz,

6

In teoria, se inizi con uno stato identico, il risultato sarà identico. In realtà, è praticamente impossibile garantire lo stato iniziale identico in apparecchiature "di dimensioni server".

Prendi variabili non inizializzate. Guarda questo codice:

  short i;

  if(i==-1)
  {
        //do something special
  }
  else
  {
        i=0;
        //do something else
  }

Ciò produrrà risultati imprevisti una volta a 65536 esecuzioni. E a meno che non si assicuri che la memoria sarà nello stesso stato prima di ogni esecuzione, isarà del tutto casuale.

Esistono centinaia di modi simili per la comparsa di errori a seguito di elementi imprevedibili dello stato iniziale che qualcuno ha dimenticato di ignorare o casi limite che si verificano raramente: condizioni di competizione in ambiente multi-thread, accesso array fuori limite, I / O disco su file system danneggiato e presto.

Se puoi provare che il programma è privo di bug, ci sono solo i raggi cosmici che possono romperlo. Ma la prova matematica della correttezza di qualcosa di più complesso di due anelli nidificati va ben oltre la portata dei sistemi più grandi (e costa una piccola fortuna), e per tutto il resto puoi solo sperare.


6

Ora la mia domanda è: un programma per computer andrà improvvisamente storto senza alcun motivo logico?

Se hai esattamente lo stesso ambiente di elaborazione, quindi dare un input X a un programma produrrà sempre lo stesso risultato R. In pratica, raramente un singolo programma viene eseguito in modo isolato. L'applicazione più semplice oggi viene eseguita in un sistema operativo e condivide la memoria con altri programmi che possono essere "caricati" in memoria contemporaneamente. Questi programmi possono alterare la memoria in modo da causare malfunzionamenti a un determinato programma. Questo è un problema famoso, ad esempio con variabili di tipo 'pointer'. Di solito tali errori causano comportamenti anomali del sistema e risultati di calcolo non errati.

Nel tuo caso, presumo che il problema potrebbe essere (e di solito lo è) non quello che ho descritto sopra. Il problema potrebbe essere che:

  • il programma ha utilizzato i tipi di dati errati per calcolare il risultato, tale errore si manifesta solo quando vengono utilizzati valori speciali.
  • il programma ha riscontrato un errore nel calcolo (a causa di una condizione logica) ma non ha gestito l'errore e ha comunque prodotto il risultato. (ad es. miscelazione di float e numeri interi aritmetici)
  • una regola aziendale o una condizione logica non sono state codificate correttamente, i dati immessi rappresentano questa condizione ma è stato utilizzato il calcolo errato. (ad es. sottrarre l'importo dall'importo del conto prima di verificare prima l'importo nel conto).
  • utilizzando formule che si applicano solo a un determinato intervallo di numeri ma i dati contengono un intervallo diverso. (ad es. calcolo di un tasso di interesse basato su un intervallo di valori)

A causa di quanto sopra e di molti altri motivi per cui le persone software spendono così tante risorse nel tentativo di creare software corretto, tuttavia, si verificano ancora errori software, ma gli errori sono "logici" e hanno una ragione, è solo che la ragione non è ovvia per alcuni senza una buona ricerca. Quindi, in generale il software testato è prevedibile e non produce risultati casuali. A causa della complessità di alcuni programmi e di altri fattori, anche i programmi testati possono andare storti, ma quando ciò accade, gli errori sono per una ragione logica.

Se sbatto sul server, uno dei numeri calcolati dal computer diventerà un altro numero e il calcolo sarà errato?

La risposta è no in generale, il software non è fragile in questo senso.

Quello che puoi fare è isolare i casi in cui si verifica l'errore, trovare la somiglianza tra questi insiemi di dati che causano l'errore e trovare la differenza tra questi insiemi e gli altri insiemi che producono il risultato corretto. Potrebbe essere possibile identificare l'insieme specifico di valori che causano il problema. Ad esempio potresti scoprire che ogni volta che una variabile ha un valore negativo, il risultato è sbagliato.

Informazioni aggiornate sugli errori di corruzione della memoria: vedere Corruzione della memoria


Stavo pensando a errori di arrotondamento composti come fonte di tali problemi. Potrebbero non apparire per molto tempo, fino a quando esattamente la giusta (o sbagliata) combinazione di input porta a tutti loro combinati finendo con un risultato che è fuori da quello che dovrebbe essere.
jwenting

3
I moderni sistemi operativi non consentono ai programmi di modificare (o addirittura leggere) la memoria appartenente ad altri programmi.
Péter Török,

Sì, i sistemi operativi moderni non consentono nulla del genere.
DeadMG

"Se hai esattamente lo stesso ambiente di elaborazione, quindi dare un input X a un programma produrrà sempre lo stesso risultato R" Non sono sicuro che sia vero. Cosa succede se uno dei blocchi SR nei componenti di memoria ottiene due 1 a causa di una corruzione precedente? en.wikipedia.org/wiki/…
Yam Marcovic

@DeadMG e Péter Török grazie per il tuo feedback, ho modificato il messaggio e aggiunto un riferimento a una pagina che descrive che il problema può ancora verificarsi (lo so come menzionato nel testo, che è altamente improbabile).
NoChance,

5

Potete garantire che un programma non abbia bug e non andrà mai male? No, sfortunatamente no.

Puoi dimostrare che un programma ha un numero sufficientemente piccolo di bug che il costo di trovarli e risolverli supera di gran lunga il beneficio di tale azione? Mi sembra che tu l'abbia già fatto.

Per parafrasare una vecchia massima statistica, tutti i programmi sono sbagliati, ma alcuni programmi sono utili.


1
+1 per "tutti i programmi sono sbagliati, ma alcuni programmi sono utili"
un CVn

Non penso che questa risposta sia effettivamente pertinente. Sembra che stia chiedendo se a volte un programma corretto potrebbe funzionare inaspettatamente a causa di un difetto ambientale.
Yam Marcovic,

Il mio punto è che nessun programma è mai "corretto". Tutto è sempre un lavoro in corso ed è sempre giusto finché non è sbagliato. L'informatica è una scienza dopo tutto. Capisco quello che stai dicendo, e potrebbe essere più dove si concentra la sua domanda. Tuttavia, penso che ciò renda la mia risposta tanto più pertinente, piuttosto che meno.
John N,

@Hallainzil: credo di aver scritto correttamente "Ciao, mondo!" programmi e simili. Ho anche scritto programmi utili corretti (anche se non grandi).
David Thornley,

2

Sono propenso a dire di no , non puoi provare che un programma non andrà mai storto o fornire un risultato errato, anche se puoi assumere un input perfetto.

Raku menzionò una prova formale di correttezza. Questa è una cosa da considerare, ma a meno che non mi sbagli completamente, dovrà comunque assumere un ambiente di esecuzione perfetto. Quindi, con un po 'di tempo e fatica, puoi forse dimostrare che il programma è corretto , ma ciò non dimostra necessariamente che produrrà sempre i risultati corretti , anche dato un input perfetto. L'ambiente di esecuzione è importante. E sarei diffidente nell'ipotizzare che anche l'input sia sempre perfetto.

Questo è il motivo per cui, in determinate situazioni di elevata disponibilità, vengono utilizzate più implementazioni e ambienti di esecuzione completamente indipendenti e i risultati vengono confrontati per assicurarsi che si trovino in un margine di errore accettabile l'uno dall'altro. In alcune situazioni, quel margine potrebbe benissimo essere zero. Già negli anni '60, questo era ritenuto abbastanza importante da includere set separati di hardware di calcolo nei veicoli spaziali. Anche se una scarica statica errata, un raggio cosmico o qualsiasi altra cosa influenzasse entrambi i computer contemporaneamente, le probabilità che entrambi vengano influenzati allo stesso modo (in particolare se entrambi funzionano ancora e producono risultati dall'aspetto valido) sono minuscole. Anche le probabilità dello stesso bug che si insinua in due implementazioni completamente separate sono estremamente ridotte. E così via.


1

La maggior parte del calcolo (standard) è deterministico, penso.

Se possibile, impostarlo per eseguire un batch di 1000 o 10000, ecc., Iterazioni con gli stessi dati di input e verificare che i risultati risultino uguali.

Assicurati che i valori correnti inseriti nel calcolo provochino un overflow o un underflow ovunque (se si tratta di un sistema più vecchio, potrebbe non essere stato progettato per essere utilizzato così a lungo).

Y2K11 qualcuno?


Fare N iterazioni e verificare i risultati non dimostra la correttezza. Nella migliore delle ipotesi, dimostra l'assenza di errori all'interno del set di campioni e anche questo presuppone che il test case (e la sua implementazione, nonché la sua esecuzione) siano assolutamente corretti. Sebbene i test siano molto utili, non affrontano le preoccupazioni del PO.
un CVn

@Michael Forse dovrei chiarire, non sto suggerendo di provare a "provare" qualcosa con questo approccio, ma se si ripetono molte altre iterazioni senza mai mostrare di nuovo l'errore, penserei a macchie solari e non a trabocco intero. Ti dà ancora più intuizioni che no, IMHO.
jonsca,

1

A meno che tu non possa controllare ogni singolo bit della macchina e ogni singolo impulso elettrico che fluisce attraverso i circuiti, non puoi garantire con assoluta certezza che qualcosa non andrà storto con il tuo programma. I moduli di memoria si guastano, le CPU possono surriscaldarsi e introdurre errori, i dischi rigidi possono confondere i dati e gli alimentatori possono introdurre rumori nel sistema. Quanto più costoso è l'hardware e tanto più ridondante è l'hardware, tanto meno probabile accadranno queste cose, ma a un certo punto l'hardware potrebbe non funzionare.

Quindi hai il sistema operativo, con bug che possono essere solleticati dai mezzi più arcani immaginabili. I compilatori possono anche avere bug oscuri che aspettano solo di trasformare abilmente il codice originale in bug difficili da rintracciare. È una giungla là fuori e il tuo povero software è vulnerabile a tutto questo. ATTENZIONE!

E nella mia esperienza, il più delle volte, ogni volta che c'è un bug in un calcolo, non dobbiamo mai scavare così lontano per trovare il colpevole. In generale quasi tutti i bug che ho visto nel mondo aziendale sono facilmente reperibili con gli strumenti di debug giusti e un po 'di grasso per i gomiti.

In altre parole, mentre l'hardware e il sistema operativo potrebbero non essere perfetti, probabilmente non dovrai mai preoccuparti di quel livello di dettaglio. Basta trovare qualcuno che conosca la lingua, che sia utile con un debugger e scavare.

"le spiegazioni più semplici sono, a parità di altre cose, generalmente meglio di quelle più complesse". - Riassunto del rasoio di Occam.


0

Sì, colpire un sistema potrebbe piegare e / o spostare le parti abbastanza da causare un circuito aperto temporaneo (o eventualmente un cortocircuito, anche se probabilmente è meno probabile).


0

Il primo computer che possedevo era un Altair 8080 con 256 byte di memoria. L'ingresso proveniva da switch di console e l'output proveniva da alcune spie lampeggianti. Se si impediscono i raggi cosmici e guasti hardware, credo che potrei provare che alcuni programmi su cui ho eseguito avrebbero sempre prodotto gli stessi risultati.

Da allora, no.


0

I test mostrano la presenza, non l'assenza di bug (Edsger W. Dijkstra)

Se stai provando a dimostrare che il tuo programma funziona correttamente testando, non funzionerà.

Tuttavia, ci sono alcuni approcci nell'informatica teorica in cui sviluppi una prova formale del software che hai scritto. A seconda della complessità del sistema, questo può essere un processo noioso. Se il tuo sistema, tuttavia, funziona con un set limitato di comandi, potresti avere successo con questo approccio.


Hai letto la domanda?
Winston Ewert,

L'ho fatto e sto dicendo che non può usare i test per garantire che un programma non vada mai storto. Ecco cosa dice il titolo della sua domanda, giusto?
Raku,

Sì, il titolo sembra dirlo. Il corpo chiaramente no.
Winston Ewert,

0

Gli ambienti hardware e software sono in costante evoluzione. Le parti mobili, l'elettricità, la temperatura, la polvere e le modifiche al codice del sistema operativo sono esempi.

Pertanto non credo sia nemmeno probabile o prevedibile che un programma software per computer si comporterà sempre allo stesso modo poiché l'ambiente è in continua evoluzione.

Il software può funzionare a lungo come previsto, ma alla fine o una piccola modifica al software del sistema operativo host cambierà, il che influirebbe sul programma in questione o l'hardware valuterà.

Sto parlando dei computer attuali.


0

Ora la mia domanda è: un programma per computer andrà improvvisamente storto senza alcun motivo logico? Se sbatto sul server, uno dei numeri calcolati dal computer diventerà un altro numero e il calcolo sarà errato?

La risposta a questa domanda è inconoscibile. È impossibile provare che qualsiasi cosa sia sempre vera nell'universo in cui ci capita di vivere. Invece facciamo ipotesi e dimostriamo che se le ipotesi valgono, anche alcune proprietà complicate valgono. Questo è ciò che garantiscono i programmi verificati formalmente. Tuttavia, la maggior parte dei programmi non è formalmente verificata, ma cerca invece di creare confidenza fornendo test. Questi test ti danno la certezza che a condizione che i test facciano quello per cui sono stati progettati e che i presupposti che hai fatto valere, il programma che stai usando funzionerà almeno qualche volta.


-1

È appena possibile che il problema sia causato dal fallimento della RAM, ma ciò è relativamente (molto) improbabile. Esegui un test di memoria, ma sii pronto a consultare il codice.


Per il downvoter - ho visto succedere. Una volta.
James McLeod,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.