www.wikidata.de-de.nina.az
Eine Zusicherung Sicherstellung oder Assertion lateinisch englisch fur Aussage Behauptung ist eine Aussage uber den Zustand eines Computerprogramms oder einer elektronischen Schaltung Mit Hilfe von Zusicherungen konnen logische Fehler im Programm oder Defekte in der umgebenden Hard oder Software erkannt und das Programm kontrolliert beendet werden Bei der Entwicklung elektronischer Schaltungen kann mittels Assertions die Einhaltung der Spezifikation in der Verifikationsphase uberpruft werden Des Weiteren konnen Assertions Informationen uber den Grad der Testabdeckung wahrend der Verifikation liefern Inhaltsverzeichnis 1 Anwendung 2 Geschichte 3 Programmierpraxis 4 Verwandte Techniken 4 1 Umformulieren des Quelltextes 4 2 Zusicherungen zur Kompilierzeit 4 3 Zusicherungen in Modultests 4 4 Spezielle Techniken fur Microsoft Compiler 5 Literatur 6 Weblinks 7 EinzelnachweiseAnwendung BearbeitenDurch die Formulierung einer Zusicherung bringt der Entwickler eines Programms seine Uberzeugung uber bestimmte Bedingungen wahrend der Laufzeit eines Programms zum Ausdruck und lasst sie Teil des Programms werden Er trennt diese Uberzeugungen von den normalen Laufzeitumstanden ab und nimmt diese Bedingungen als stets wahr an Abweichungen hiervon werden nicht regular behandelt damit die Vielzahl moglicher Falle nicht die Losung des Problems vereitelt denn naturlich kann es wahrend der Laufzeit eines Programms dazu kommen dass 2 2 4 einmal nicht gilt z B weil Variablen durch Programmfehler im Betriebssystem uberschrieben wurden Damit unterscheiden sich Zusicherungen von der klassischen Fehlerkontrolle durch Kontrollstrukturen oder Ausnahmen Exceptions die einen Fehlerfall als mogliches Ergebnis einschliessen In einigen Programmiersprachen wurden Zusicherungen auf Sprachebene eingebaut haufig werden sie als Sonderform der Ausnahmen verwirklicht Fehlerbehandlungen sollten fur Fehlerzustande geschrieben werden welche man erwartet Zusicherungen fur Fehlerzustande die niemals auftreten sollten 1 Geschichte BearbeitenEingefuhrt wurde der Begriff assertion von Robert Floyd 1967 in seinem Artikel Assigning Meanings to Programs Er schlug eine Methode vor mit der man die Korrektheit von Flussdiagrammen beweisen konnte indem man jedes Element des Flussdiagramms mit einer Zusicherung versieht Floyd gab Regeln an nach denen die Zusicherungen bestimmt werden konnten Tony Hoare entwickelte diese Methode zum Hoare Kalkul fur prozedurale Programmiersprachen weiter Im Hoare Kalkul wird eine Zusicherung die vor einer Anweisung steht Vorbedingung englisch precondition eine Zusicherung nach einer Anweisung Nachbedingung englisch postcondition genannt Eine Zusicherung die bei jedem Schleifendurchlauf erfullt sein muss heisst Invariante Niklaus Wirth benutzte Zusicherungen zur Definition der Semantik von Pascal und schlug vor dass Programmierer in ihre Programme Kommentare mit Zusicherungen schreiben sollten Aus diesem Grund sind Kommentare in Pascal mit geschweiften Klammern umgeben eine Syntax die Hoare in seinem Kalkul fur Zusicherungen verwendet hatte In Borland Delphi wurde die Idee ubernommen und ist als System Funktion assert eingebaut In der Programmiersprache Java steht ab Version 1 4 das Schlusselwort assert zur Verfugung Die zur Entwicklung elektronischer Schaltungen eingesetzten Hardwarebeschreibungssprachen VHDL und SystemVerilog unterstutzen Assertions PSL ist eine eigenstandige Beschreibungssprache fur Assertions die Modelle in VHDL Verilog und SystemC unterstutzt Wahrend der Verifikation wird vom Simulationswerkzeug erfasst wie oft die Assertion ausgelost wurde und wie oft die Zusicherung erfullt oder verletzt wurde Wurde die Assertion ausgelost und die Zusicherung nie verletzt gilt die Schaltung als erfolgreich verifiziert Wurde jedoch die Assertion wahrend der Simulation nie ausgelost besteht eine mangelnde Testabdeckung und die Verifikationsumgebung muss erweitert werden Programmierpraxis BearbeitenIn der Programmiersprache C konnte eine Zusicherung in etwa so eingesetzt werden include lt assert h gt diese Funktion liefert die Lange eines nullterminierten Strings falls der ubergebene auf die Adresse NULL verweist wird das Programm kontrolliert abgebrochen strlen pruft das nicht selbst int strlenChecked char s assert s NULL return strlen s In diesem Beispiel wird uber die Einbindung der Header Datei assert h das Makro assert verwendbar Dieses Makro sorgt im Falle eines Fehlschlags fur die Ausgabe einer Standardmeldung in der die nicht erfullte Bedingung zitiert wird und Dateiname und Zeilennummer hinzugefugt werden Eine solche Meldung konnte dann so aussehen i Assertion s NULL failed in file C Projects Sudoku utils c line 9 i Java kennt das Konzept der Zusicherungen ab Version 1 4 Hier wird allerdings das Programm nicht notwendigerweise beendet sondern eine sogenannte Ausnahme englisch exception ausgelost die innerhalb des Programms weiterverarbeitet werden kann Ein einfaches Beispiel einer Assertion hier in Java Syntax ist int n readInput n n n Quadrieren assert n gt 0 Mit dieser Assertion sagt der Programmierer Ich bin mir sicher dass nach dieser Stelle n grosser gleich null ist Bertrand Meyer hat die Idee von Zusicherungen in dem Programmierparadigma Design by contract verarbeitet und in der Programmiersprache Eiffel umgesetzt Vorbedingungen werden durch require Klauseln Nachbedingungen durch ensure Klauseln beschrieben Fur Klassen konnen Invarianten spezifiziert werden Auch in Eiffel werden Ausnahmen ausgelost wenn eine Zusicherung nicht erfullt ist Verwandte Techniken BearbeitenAssertions entdecken Programmfehler zur Laufzeit beim Anwender also erst wenn es zu spat ist Um Meldungen uber Interne Fehler moglichst zu vermeiden versucht man durch geeignete Formulierung des Quelltextes logische Fehler bereits zur Kompilierzeit durch den Compiler in Form von Fehlern und Warnungen aufdecken zu lassen Logische Fehler die man auf diese Weise nicht finden kann konnen haufig mittels Modultests aufgedeckt werden Umformulieren des Quelltextes Bearbeiten Indem Fallunterscheidungen auf ein Minimum reduziert werden ist mancher Fehler nicht ausdruckbar Dann ist er als logischer Fehler auch nicht moglich Kurvenrichtung public enum TURN LEFT TURN RIGHT TURN Methode liefert den Text zu einer Kurvenrichtung public String getTurnText TURN turn switch turn case LEFT TURN return Linkskurve case RIGHT TURN return Rechtskurve default assert false Es gibt nur Links oder Rechtskurven Kann nicht auftreten Nehmen wir an es gabe nur die zwei Falle das ist in der Tat haufig so dann konnten wir einen einfachen Wahrheitswert verwenden anstelle einer spezielleren Kodierung Methode liefert den Text zu einer Kurvenrichtung public String getTurnText boolean isLeftTurn if isLeftTurn return Linkskurve return Rechtskurve In vielen Fallen wird so wie in diesem Beispiel dadurch der Code weniger explizit und somit unverstandlicher Zusicherungen zur Kompilierzeit Bearbeiten Wahrend die oben beschriebenen Assertionen zur Laufzeit des Programms gepruft werden gibt es in C die Moglichkeit Bedingungen auch schon beim Ubersetzen des Programms durch den Compiler zu uberprufen Es konnen nur Bedingungen nachgepruft werden die zur Ubersetzungszeit bekannt sind z B sizeof int 4 Schlagt ein Test fehl lasst sich das Programm nicht ubersetzen if sizeof int 4 error unerwartete int Grosse endif Fruher hing das stark von der Funktionalitat des jeweiligen Compilers ab und manche Formulierungen waren gewohnungsbedurftig Die Korrektheit unserer Implementierung hangt davon ab dass ein int 4 Bytes gross ist Falls dies nicht gilt bricht der Compiler mit der Meldung ab dass Arrays mindestens ein Element haben mussen void validIntSize void int valid sizeof int 4 Mit C11 bzw C 11 wurden zur Losung dieses Problems je die Schlusselworte Static assert bzw static assert in C11 zusatzlich als Makro implementiert eingefuhrt in C als auch C void validIntSize void static assert sizeof int 4 implementation of validIntSize does not work with the int size of your compiler Zusicherungen in Modultests Bearbeiten Ein Bereich in dem ebenfalls Zusicherungen eine Rolle spielen sind Modultests u a Kernbestandteil des Extreme Programmings Wann immer man am Quelltext Anderungen z B Refactorings vornimmt z B um weitere Funktionen zu integrieren fuhrt man Tests auf Teilfunktionen Modulen also z B Funktionen und Prozeduren Klassen aus um die bekannte gewunschte Funktionalitat zu evaluieren Im Gegensatz zu assert wird bei einem Fehlschlag nicht das ganze Programm beendet sondern nur der Test als gescheitert betrachtet und weitere Tests ausgefuhrt um moglichst viele Fehler zu finden Laufen alle Tests fehlerfrei dann sollte davon ausgegangen werden konnen dass die gewunschte Funktionalitat besteht Von besonderer Bedeutung ist der Umstand dass Modultests ublicherweise nicht im Produktivcode ausgefuhrt werden sondern zur Entwicklungszeit Das bedeutet dass Assertions im fertigen Programm als Gegenpart zu betrachten sind Spezielle Techniken fur Microsoft Compiler Bearbeiten Neben Assert wird auch Verify verwendet Verify fuhrt alle Anweisungen aus die in die Berechnung der Bedingung einfliessen gleichgultig ob mit oder ohne Debug Absicht kompiliert wurde Die Uberprufung findet aber nur in der Debug Variante statt d h auch hier kann ein Programm in obskurer Weise scheitern falls die Zusicherung nicht erfullt ist die Variable anzahl wird immer erhoht Verify anzahl gt 2 Assert Valid wird eingesetzt um Objekte auf ihre Gultigkeit zu testen Dazu gibt es in der Basisklasse der Objekthierarchie die virtuelle Methode AssertValid Die Methode sollte fur jede konkrete Klasse uberschrieben werden um die internen Felder der Klasse auf Gultigkeit zu testen Example for CObject AssertValid void CAge AssertValid const CObject AssertValid ASSERT m years gt 0 ASSERT m years lt 105 Literatur BearbeitenRobert W Floyd Assigning meanings to programs In Proceedings of Symposia in Applied Mathematics Volume 19 1967 S 19 32 Weblinks BearbeitenAssertions in Java bei Oracle Assertions in C mit Boost Ubersetzungsvarianten von Assertion laut UML GlossarEinzelnachweise Bearbeiten Steve McConnell Code Complete A Practical Handbook of Software Construction Hrsg Microsoft Press 2 Auflage 2004 ISBN 978 0 7356 1967 8 englisch Abgerufen von https de wikipedia org w index php title Assertion Informatik amp oldid 235987079