Wir haben hier ein System. In letzter Zeit gibt es eine falsche Berechnung in einer der Zahlen im vom System generierten Bericht. Aufgrund unserer Erfahrung sind wir seit einigen Jahren nie mehr auf Probleme / Fehler in diesem System gestoßen.
Da der Schreiber dieses Systems bereits gegangen war, können wir die Programme kaum verfolgen. Wir haben jedoch die Eingabedaten und die Einstellungen überprüft und sie sind richtig.
Meine Frage ist nun, wird ein Computerprogramm plötzlich ohne logischen Grund schief gehen? Wenn ich auf dem Server-Computer zuschlage, wird eine der vom Computer berechneten Zahlen zu einer anderen Zahl und macht die Berechnung falsch?
Ich stimme zu, dass meine Idee dort ziemlich verrückt ist, aber ich möchte nur wissen, wie können wir wissen, dass das Problem nicht durch das Programm und die Eingabe verursacht wird, sondern durch einige andere Faktoren?
PS Dieses verrückte System hat kein Protokoll.
Antworten:
Ich würde nein sagen!
Theoretisch lautet die Antwort nein, wir können nur testen auf:
Dies ist erheblich weniger als die insgesamt mögliche Anzahl von Umgebungen, Zeiten und Fällen, auf die das Programm in seiner Lebensdauer stoßen kann. Wir haben auch wenig Wissen über die Zukunft. Sollten Sie mit einer Inflation von 10.000% programmieren, sollte Ihr Programm mit einer neuen Super-Super-31-Bit-Architektur fertig werden?
Die Theorie wird durch Erfahrungen gestützt, die ich persönlich gemacht habe:
quelle
Wenn Sie mit einem identischen Zustand beginnen, ist das Ergebnis theoretisch identisch. In der Realität ist es so gut wie unmöglich, einen identischen Ausgangszustand in Geräten mit "Servergröße" sicherzustellen.
Nehmen Sie nicht initialisierte Variablen. Schauen Sie sich diesen Code an:
Dies führt in 65536 Läufen zu unerwarteten Ergebnissen. Und wenn Sie nicht sicherstellen, dass sich der Speicher vor jedem Lauf im selben Zustand befindet,
i
ist er völlig zufällig.Es gibt Hunderte ähnlicher Möglichkeiten, wie Fehler auftreten können, wenn unvorhersehbare Elemente des Anfangszustands, die jemand vergessen hat, zu überschreiben, oder Grenzfälle, die selten auftreten - Race-Bedingungen in einer Umgebung mit mehreren Threads, Zugriff außerhalb der Grenzen des Arrays, Festplatten-E / A auf einem beschädigten Dateisystem und demnächst.
Wenn Sie beweisen können, dass das Programm fehlerfrei ist, gibt es nur die kosmischen Strahlen, die es brechen können. Der mathematische Beweis der Richtigkeit von etwas Komplexerem als zwei verschachtelten Schleifen geht jedoch weit über den Rahmen der größten Systeme hinaus (und kostet ein kleines Vermögen), und im Übrigen kann man nur hoffen.
quelle
Wenn Sie genau dieselbe Computerumgebung haben, führt eine Eingabe X für ein Programm immer zu demselben Ergebnis R. In der Praxis ist es selten, dass ein einzelnes Programm isoliert ausgeführt wird. Die einfachste Anwendung läuft heute unter einem Betriebssystem und teilt den Speicher mit anderen Programmen, die möglicherweise gleichzeitig in den Speicher geladen werden. Diese Programme können den Speicher so verändern, dass ein bestimmtes Programm fehlerhaft funktioniert. Dies ist beispielsweise ein bekanntes Problem bei Variablen vom Typ 'Zeiger'. Normalerweise verursachen solche Fehler ein abnormales Systemverhalten und keine falschen Berechnungsergebnisse.
In Ihrem Fall gehe ich davon aus, dass das Problem möglicherweise nicht das ist, was ich oben beschrieben habe (und normalerweise auch nicht). Das Problem kann sein, dass:
Aus den oben genannten und vielen anderen Gründen geben Software-Leute so viel Ressourcen aus, um korrekte Software zu erstellen. Es treten jedoch immer noch Softwarefehler auf, aber die Fehler sind "logisch" und haben einen Grund. Der Grund ist nur nicht offensichtlich zu einigen ohne gute Forschung. Im Allgemeinen ist getestete Software vorhersehbar und führt nicht zu zufälligen Ergebnissen. Aufgrund der Komplexität einiger Programme und anderer Faktoren können sogar getestete Programme schief gehen. In diesem Fall sind Fehler jedoch logisch.
Die Antwort lautet im Allgemeinen Nein, Software ist in diesem Sinne nicht fragil.
Sie können die Fälle isolieren, in denen der Fehler auftritt, die Ähnlichkeit zwischen diesen Datensätzen ermitteln, die den Fehler verursachen, und den Unterschied zwischen diesen Sätzen und den anderen Sätzen ermitteln, die das richtige Ergebnis liefern. Möglicherweise können Sie die spezifischen Werte identifizieren, die das Problem verursachen. Beispielsweise stellen Sie möglicherweise fest, dass jedes Mal, wenn eine Variable einen negativen Wert hat, das Ergebnis falsch ist.
Aktualisierte Informationen zu Speicherbeschädigungsfehlern: Weitere Informationen finden Sie unter Speicherbeschädigung
quelle
Können Sie garantieren, dass ein Programm keine Fehler aufweist und niemals schief gehen wird? Nein, leider nicht.
Können Sie nachweisen, dass ein Programm eine ausreichend geringe Anzahl von Fehlern aufweist, sodass die Kosten für das Auffinden und Beheben dieser Fehler den Nutzen dieser Aktion bei weitem übersteigen? Es klingt für mich so, als hättest du es schon getan.
Um eine alte Statistikmaxime zu paraphrasieren, sind alle Programme falsch, aber einige Programme sind nützlich.
quelle
Ich neige dazu, nein zu sagen . Sie können nicht beweisen, dass ein Programm niemals schief gehen oder ein falsches Ergebnis liefern wird, selbst wenn Sie von einer perfekten Eingabe ausgehen können.
Raku erwähnte den formalen Beweis der Richtigkeit. Das ist eine Sache, die zu beachten ist, aber wenn ich mich nicht völlig irre, muss dies immer noch eine perfekte Ausführungsumgebung voraussetzen. Mit etwas Zeit und Mühe können Sie vielleicht beweisen, dass das Programm korrekt ist , aber das beweist nicht unbedingt, dass es auch bei perfekter Eingabe immer die richtigen Ergebnisse liefert. Die Ausführungsumgebung ist wichtig. Und ich würde vorsichtig sein anzunehmen, dass die Eingabe auch immer perfekt ist.
Aus diesem Grund werden in bestimmten Hochverfügbarkeitssituationen mehrere völlig unabhängige Implementierungen und Ausführungsumgebungen verwendet und die Ergebnisse verglichen, um sicherzustellen, dass sie innerhalb einer akzeptablen Fehlergrenze voneinander liegen. In einigen Situationen kann dieser Spielraum durchaus Null sein. Bereits in den 1960er Jahren wurde dies als wichtig genug erachtet, um separate Sätze von Computerhardware in Raumfahrzeuge einzubeziehen. Selbst wenn eine fehlerhafte statische Entladung, kosmische Strahlung oder was auch immer beide Computer gleichzeitig beeinflussen würde, ist die Wahrscheinlichkeit, dass beide auf die gleiche Weise betroffen sind (insbesondere wenn beide noch funktionieren und gültige Ergebnisse liefern), gering. Die Wahrscheinlichkeit, dass sich derselbe Fehler in zwei völlig getrennte Implementierungen einschleicht, ist ebenfalls äußerst gering. Und so weiter.
quelle
Das meiste (Standard-) Computing ist deterministisch, würde ich denken.
Richten Sie es nach Möglichkeit so ein, dass ein Stapel von 1000 oder 10000 usw. Iterationen mit denselben Eingabedaten ausgeführt wird, und stellen Sie sicher, dass die Ergebnisse gleich sind.
Stellen Sie sicher, dass die aktuellen Werte, die in die Berechnung einfließen, irgendwo einen Über- oder Unterlauf verursachen (wenn es sich um ein älteres System handelt, war es möglicherweise nicht für eine so lange Verwendung vorgesehen).
Y2K11 jemand?
quelle
Wenn Sie nicht jedes einzelne Bit in der Maschine und jeden durch die Schaltung fließenden elektrischen Impuls steuern können, können Sie nicht mit absoluter Sicherheit garantieren, dass mit Ihrem Programm nichts schief geht. Speichermodule fallen aus, CPUs können überhitzen und Fehler verursachen, Festplatten können Daten verschlüsseln und Netzteile können Rauschen in das System einbringen. Je teurer die Hardware und je redundanter die Hardware ist, desto unwahrscheinlicher ist es, dass diese Dinge auftreten, aber irgendwann kann die Hardware ausfallen.
Dann haben Sie das Betriebssystem mit Fehlern, die mit den arkansten Mitteln gekitzelt werden können, die man sich vorstellen kann. Compiler haben möglicherweise auch obskure Fehler, die nur darauf warten, Ihren makellosen Code geschickt in schwer zu verfolgende Fehler umzuwandeln. Es ist ein Dschungel da draußen, und Ihre schlechte Software ist für all dies anfällig. ACHTUNG!
Und meiner Erfahrung nach müssen wir meistens, wenn es einen Fehler in einer Berechnung gibt, nie annähernd so weit graben, um den Schuldigen zu finden. Im Allgemeinen lassen sich fast alle Fehler, die ich in der Unternehmenswelt gesehen habe, mit den richtigen Debugging-Tools und etwas Ellbogenfett leicht finden.
Mit anderen Worten, obwohl die Hardware und das Betriebssystem möglicherweise nicht perfekt sind, müssen Sie sich wahrscheinlich nie um diese Detailgenauigkeit kümmern. Finden Sie einfach jemanden, der die Sprache kennt und mit einem Debugger vertraut ist, und vertiefen Sie sich.
"Einfachere Erklärungen sind bei sonst gleichen Bedingungen im Allgemeinen besser als komplexere." - Zusammenfassung von Occams Rasiermesser.
quelle
Ja, wenn Sie auf ein System treffen, können Teile so weit gebogen und / oder bewegt werden, dass ein vorübergehender Leerlauf (oder möglicherweise ein Kurzschluss, obwohl dies wahrscheinlich weniger wahrscheinlich ist) verursacht wird.
quelle
Der erste Computer, den ich besaß, war ein Altair 8080 mit 256 Byte Speicher. Die Eingabe erfolgte über Konsolenschalter und die Ausgabe über einige blinkende Lichter. Wenn Sie kosmische Strahlung und Hardwarefehler nicht zulassen, könnte ich meiner Meinung nach beweisen, dass einige Programme, die ich darauf ausgeführt habe, immer die gleichen Ergebnisse liefern.
Seitdem nein.
quelle
Wenn Sie durch Testen beweisen möchten, dass Ihr Programm ordnungsgemäß funktioniert, funktioniert es nicht.
Es gibt jedoch einige Ansätze in der theoretischen Informatik, bei denen Sie einen formalen Beweis für die von Ihnen geschriebene Software entwickeln. Abhängig von der Komplexität Ihres Systems kann dies jedoch ein langwieriger Prozess sein. Wenn Ihr System jedoch mit einem eingeschränkten Befehlssatz arbeitet, können Sie mit diesem Ansatz erfolgreich sein.
quelle
Hardware- und Softwareumgebungen sind in ständigem Wandel. Beispiele für Änderungen an beweglichen Teilen, Elektrizität, Temperatur, Staub und Betriebssystemcode sind Beispiele.
Daher halte ich es nicht einmal für wahrscheinlich oder zu erwarten, dass sich ein Computersoftwareprogramm immer gleich verhält, da sich die Umgebung ständig ändert.
Die Software kann erwartungsgemäß lange laufen, aber irgendwann ändert sich entweder eine kleine Änderung an der Host-Betriebssystemsoftware, die sich auf das betreffende Programm auswirkt, oder die Hardware wird einen Wert haben.
Ich spreche über aktuelle Computer.
quelle
Die Antwort auf diese Frage ist nicht bekannt. Es ist unmöglich zu beweisen, dass für das Universum, in dem wir gerade leben, immer etwas zutrifft. Stattdessen machen wir Annahmen und beweisen, dass, wenn die Annahmen zutreffen, auch eine komplizierte Eigenschaft gilt. Dies garantieren formal verifizierte Programme. Die meisten Programme werden jedoch nicht offiziell überprüft, sondern versuchen, durch die Bereitstellung von Tests Vertrauen aufzubauen. Diese Tests geben Ihnen die Gewissheit, dass das von Ihnen verwendete Programm zumindest zeitweise funktioniert, sofern die Tests das tun, wofür sie entwickelt wurden, und dass die von Ihnen getroffenen Annahmen zutreffen.
quelle
Es ist kaum möglich, dass das Problem durch einen RAM-Fehler verursacht wird, dies ist jedoch relativ (sehr) unwahrscheinlich. Führen Sie einen Speichertest durch, aber seien Sie bereit, den Code zu durchsuchen.
quelle