<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Assertion_%28Informatik%29</id>
	<title>Assertion (Informatik) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Assertion_%28Informatik%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Assertion_(Informatik)&amp;action=history"/>
	<updated>2026-06-04T08:10:14Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Assertion_(Informatik)&amp;diff=65834&amp;oldid=prev</id>
		<title>~2025-38741-3: Konsistente Kommentarformatierung</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Assertion_(Informatik)&amp;diff=65834&amp;oldid=prev"/>
		<updated>2025-08-13T10:45:40Z</updated>

		<summary type="html">&lt;p&gt;Konsistente Kommentarformatierung&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Eine &amp;#039;&amp;#039;&amp;#039;Zusicherung&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;Sicherstellung&amp;#039;&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;&amp;#039;[[Assertion]]&amp;#039;&amp;#039;&amp;#039; ({{laS}}/{{enS}} für &amp;#039;&amp;#039;Aussage&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Behauptung&amp;#039;&amp;#039;) ist eine Aussage über den Zustand eines [[Computerprogramm]]s oder einer [[Elektronische Schaltung|elektronischen Schaltung]]. Mit Hilfe von Zusicherungen können 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 überprüft werden. Des Weiteren können Assertions Informationen über den Grad der [[Testabdeckung]] während der Verifikation liefern.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
Durch die Formulierung einer Zusicherung bringt der Entwickler eines Programms seine Überzeugung über bestimmte Bedingungen während der Laufzeit eines Programms zum Ausdruck und lässt sie &amp;#039;&amp;#039;Teil des Programms&amp;#039;&amp;#039; werden. Er trennt diese Überzeugungen von den normalen Laufzeitumständen ab und nimmt diese Bedingungen als stets wahr an. Abweichungen hiervon werden nicht regulär behandelt, damit die Vielzahl möglicher Fälle nicht die Lösung des Problems vereitelt, denn natürlich kann es während der Laufzeit eines Programms dazu kommen, dass 2+2=4 einmal nicht gilt, z.&amp;amp;nbsp;B. weil Variablen durch [[Programmfehler]] im Betriebssystem überschrieben wurden.&lt;br /&gt;
&lt;br /&gt;
Damit unterscheiden sich Zusicherungen von der klassischen Fehlerkontrolle durch Kontrollstrukturen oder Ausnahmen ([[Exception]]s), die einen Fehlerfall als mögliches Ergebnis &amp;#039;&amp;#039;einschließen&amp;#039;&amp;#039;. In einigen [[Programmiersprache]]n wurden Zusicherungen auf Sprachebene eingebaut, häufig werden sie als Sonderform der [[Ausnahmebehandlung|Ausnahmen]] verwirklicht.&lt;br /&gt;
&lt;br /&gt;
Fehlerbehandlungen sollten für Fehlerzustände geschrieben werden, welche man erwartet; Zusicherungen für Fehlerzustände, die niemals auftreten sollten.&amp;lt;ref&amp;gt;{{Literatur |Autor=Steve McConnell |Hrsg=Microsoft Press |Titel=Code Complete. A Practical Handbook of Software Construction |Auflage=2 |Datum=2004 |ISBN=978-0-7356-1967-8 |Sprache=en}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geschichte ==&lt;br /&gt;
Eingeführt wurde der Begriff &amp;#039;&amp;#039;assertion&amp;#039;&amp;#039; von [[Robert Floyd]] 1967 in seinem Artikel &amp;#039;&amp;#039;Assigning Meanings to Programs&amp;#039;&amp;#039;. Er schlug eine Methode vor, mit der man die Korrektheit von [[Programmablaufplan|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-Kalkül]] für [[prozedurale Programmiersprache]]n weiter. Im Hoare-Kalkül wird eine Zusicherung, die vor einer Anweisung steht, &amp;#039;&amp;#039;[[Vorbedingung (Informatik)|Vorbedingung]]&amp;#039;&amp;#039; (englisch &amp;#039;&amp;#039;precondition&amp;#039;&amp;#039;), eine Zusicherung nach einer Anweisung &amp;#039;&amp;#039;[[Nachbedingung (Informatik)|Nachbedingung]]&amp;#039;&amp;#039; (englisch &amp;#039;&amp;#039;postcondition&amp;#039;&amp;#039;) genannt. Eine Zusicherung, die bei jedem Schleifendurchlauf erfüllt sein muss, heißt &amp;#039;&amp;#039;[[Invariante (Informatik)|Invariante]]&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Niklaus Wirth]] benutzte Zusicherungen zur Definition der Semantik von [[Pascal (Programmiersprache)|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 Kalkül für Zusicherungen verwendet hatte.&lt;br /&gt;
&lt;br /&gt;
In [[Borland Delphi]] wurde die Idee übernommen und ist als System-Funktion &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; eingebaut. In der Programmiersprache [[Java (Programmiersprache)|Java]] steht ab Version 1.4 das Schlüsselwort &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die zur Entwicklung elektronischer Schaltungen eingesetzten Hardwarebeschreibungssprachen [[Very High Speed Integrated Circuit Hardware Description Language|VHDL]] und [[SystemVerilog]] unterstützen Assertions. [[Property Specification Language|PSL]] ist eine eigenständige Beschreibungssprache für Assertions, die Modelle in VHDL, [[Verilog]] und [[SystemC]] unterstützt. Während der Verifikation wird vom Simulationswerkzeug erfasst, wie oft die Assertion ausgelöst wurde und wie oft die Zusicherung erfüllt oder verletzt wurde. Wurde die Assertion ausgelöst und die Zusicherung nie verletzt, gilt die Schaltung als erfolgreich verifiziert. Wurde jedoch die Assertion während der Simulation nie ausgelöst, besteht eine mangelnde Testabdeckung und die Verifikationsumgebung muss erweitert werden.&lt;br /&gt;
&lt;br /&gt;
== Programmierpraxis ==&lt;br /&gt;
In der [[C (Programmiersprache)|Programmiersprache C]] könnte eine Zusicherung in etwa so eingesetzt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;assert.h&amp;gt;&lt;br /&gt;
/// diese Funktion liefert die Länge eines nullterminierten Strings&lt;br /&gt;
/// falls der übergebene auf die Adresse NULL verweist, wird das&lt;br /&gt;
/// Programm kontrolliert abgebrochen. (strlen prüft das nicht selbst)&lt;br /&gt;
int strlenChecked(char* s) {&lt;br /&gt;
  assert(s != NULL);&lt;br /&gt;
  return strlen(s);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In diesem Beispiel wird über die Einbindung der [[Header-Datei]] assert.h das [[Makro]] &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; verwendbar. Dieses Makro sorgt im Falle eines Fehlschlags für die Ausgabe einer Standardmeldung, in der die nicht erfüllte Bedingung zitiert wird und [[Dateiname]] und Zeilennummer hinzugefügt werden. Eine solche Meldung könnte dann so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;Assertion &amp;quot;s!=NULL&amp;quot; failed in file &amp;quot;C:\Projects\Sudoku\utils.c&amp;quot;, line 9&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Java (Programmiersprache)|Java]] kennt das Konzept der Zusicherungen ab Version 1.4. Hier wird allerdings das Programm nicht notwendigerweise beendet, sondern eine sogenannte [[Ausnahmebehandlung|Ausnahme]] (englisch &amp;#039;&amp;#039;exception&amp;#039;&amp;#039;) ausgelöst, die innerhalb des Programms weiterverarbeitet werden kann.&lt;br /&gt;
&lt;br /&gt;
Ein einfaches Beispiel einer Assertion (hier in [[Java-Syntax]]) ist&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
int n = readInput();&lt;br /&gt;
n = n * n; // Quadrieren&lt;br /&gt;
assert n &amp;gt;= 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit dieser Assertion sagt der Programmierer „Ich bin mir sicher, dass nach dieser Stelle n größer gleich null ist“.&lt;br /&gt;
&lt;br /&gt;
[[Bertrand Meyer]] hat die Idee von Zusicherungen in dem Programmierparadigma [[Design by contract]] verarbeitet und in der Programmiersprache [[Eiffel (Programmiersprache)|Eiffel]] umgesetzt. Vorbedingungen werden durch &amp;#039;&amp;#039;require&amp;#039;&amp;#039;-Klauseln, Nachbedingungen durch &amp;#039;&amp;#039;ensure&amp;#039;&amp;#039;-Klauseln beschrieben. Für Klassen können Invarianten spezifiziert werden. Auch in Eiffel werden Ausnahmen ausgelöst, wenn eine Zusicherung nicht erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
== Verwandte Techniken ==&lt;br /&gt;
Assertions entdecken Programmfehler zur Laufzeit beim Anwender, also erst, wenn es zu spät ist. Um Meldungen über „Interne Fehler“ möglichst zu vermeiden, versucht man, durch geeignete Formulierung des [[Quelltext]]es logische Fehler bereits zur [[Übersetzungszeit|Kompilierzeit]] (durch den [[Compiler]]) in Form von Fehlern und Warnungen aufdecken zu lassen. Logische Fehler, die man auf diese Weise nicht finden kann, können häufig mittels [[Modultest]]s aufgedeckt werden.&lt;br /&gt;
&lt;br /&gt;
=== Umformulieren des Quelltextes ===&lt;br /&gt;
Indem Fallunterscheidungen auf ein Minimum reduziert werden, ist mancher Fehler nicht ausdrückbar. Dann ist er als logischer Fehler auch nicht möglich.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
// Kurvenrichtung&lt;br /&gt;
public enum TURN { LEFT_TURN, RIGHT_TURN }&lt;br /&gt;
&lt;br /&gt;
// Methode liefert den Text zu einer Kurvenrichtung&lt;br /&gt;
public String getTurnText(TURN turn) {&lt;br /&gt;
  switch(turn) {&lt;br /&gt;
    case LEFT_TURN: return &amp;quot;Linkskurve&amp;quot;;&lt;br /&gt;
    case RIGHT_TURN: return &amp;quot;Rechtskurve&amp;quot;;&lt;br /&gt;
    default: assert false: &amp;quot;Es gibt nur Links- oder Rechtskurven&amp;quot;; // Kann nicht auftreten&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, es gäbe nur die zwei Fälle (das ist in der Tat häufig so), dann könnten wir einen einfachen Wahrheitswert verwenden, anstelle einer spezielleren Kodierung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
// Methode liefert den Text zu einer Kurvenrichtung&lt;br /&gt;
public String getTurnText(boolean isLeftTurn) {&lt;br /&gt;
  if (isLeftTurn) return &amp;quot;Linkskurve&amp;quot;;&lt;br /&gt;
  return &amp;quot;Rechtskurve&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In vielen Fällen wird so wie in diesem Beispiel dadurch der Code weniger explizit und somit unverständlicher.&lt;br /&gt;
&lt;br /&gt;
=== Zusicherungen zur Kompilierzeit ===&lt;br /&gt;
Während die oben beschriebenen Assertionen zur Laufzeit des Programms geprüft werden, gibt es in [[C++]] die Möglichkeit, Bedingungen auch schon beim Übersetzen des Programms durch den [[Compiler]] zu überprüfen. Es können nur Bedingungen nachgeprüft werden, die zur Übersetzungszeit bekannt sind, z.&amp;amp;nbsp;B. &amp;lt;code&amp;gt;sizeof(int) == 4&amp;lt;/code&amp;gt;. Schlägt ein Test fehl, lässt sich das Programm nicht übersetzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Cpp&amp;quot;&amp;gt;&lt;br /&gt;
#if sizeof(int) != 4&lt;br /&gt;
  #error &amp;quot;unerwartete int-Größe&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Früher hing das stark von der Funktionalität des jeweiligen Compilers ab und manche Formulierungen waren gewöhnungsbedürftig:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Cpp&amp;quot;&amp;gt;&lt;br /&gt;
/// Die Korrektheit unserer Implementierung hängt davon ab,&lt;br /&gt;
/// dass ein int 4 Bytes groß ist. Falls dies nicht gilt,&lt;br /&gt;
/// bricht der Compiler mit der Meldung ab, dass&lt;br /&gt;
/// Arrays mindestens ein Element haben müssen:&lt;br /&gt;
void validIntSize(void) {&lt;br /&gt;
  int valid[sizeof(int)==4];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit [[C (Programmiersprache)#C11|C11]] bzw. C++11 wurden zur Lösung dieses Problems je die [[Schlüsselwort (Programmierung)|Schlüsselworte]] _Static_assert bzw. static_assert (in C11 zusätzlich als Makro implementiert) eingeführt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// in C als auch C++&lt;br /&gt;
void validIntSize(void) {&lt;br /&gt;
  static_assert(sizeof(int)==4,&lt;br /&gt;
    &amp;quot;implementation of validIntSize does not work with the int size of your compiler&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zusicherungen in Modultests ===&lt;br /&gt;
Ein Bereich in dem ebenfalls Zusicherungen eine Rolle spielen, sind [[Modultest]]s (u.&amp;amp;nbsp;a. Kernbestandteil des [[Extreme Programming]]s). Wann immer man am Quelltext Änderungen (z.&amp;amp;nbsp;B. [[Refactoring]]s) vornimmt, z.&amp;amp;nbsp;B. um weitere Funktionen zu integrieren, führt man Tests auf Teilfunktionen (Modulen, also z.&amp;amp;nbsp;B. Funktionen und Prozeduren, Klassen) aus, um die bekannte (gewünschte) Funktionalität zu evaluieren.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu assert wird bei einem Fehlschlag nicht das ganze Programm beendet, sondern nur der Test als gescheitert betrachtet und weitere Tests ausgeführt, um möglichst viele Fehler zu finden. Laufen alle Tests fehlerfrei, dann sollte davon ausgegangen werden können, dass die gewünschte Funktionalität besteht.&lt;br /&gt;
&lt;br /&gt;
Von besonderer Bedeutung ist der Umstand, dass Modultests üblicherweise nicht im Produktivcode ausgeführt werden, sondern zur Entwicklungszeit. Das bedeutet, dass Assertions im fertigen Programm als Gegenpart zu betrachten sind.&lt;br /&gt;
&lt;br /&gt;
=== Spezielle Techniken für Microsoft-Compiler ===&lt;br /&gt;
Neben Assert wird auch &amp;#039;&amp;#039;&amp;#039;Verify&amp;#039;&amp;#039;&amp;#039; verwendet. Verify führt alle Anweisungen aus, die in die Berechnung der Bedingung einfließen, gleichgültig, ob mit oder ohne Debug-Absicht kompiliert wurde. Die Überprüfung findet aber nur in der Debug-Variante statt, d.&amp;amp;nbsp;h. auch hier kann ein Programm in obskurer Weise scheitern, falls die Zusicherung nicht erfüllt ist.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// die Variable anzahl wird immer erhöht&lt;br /&gt;
Verify(++anzahl&amp;gt;2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assert_Valid&amp;#039;&amp;#039;&amp;#039; wird eingesetzt, um Objekte auf ihre Gültigkeit zu testen. Dazu gibt es in der Basisklasse der Objekthierarchie die virtuelle Methode &amp;lt;code&amp;gt;AssertValid()&amp;lt;/code&amp;gt;. Die Methode sollte für jede konkrete Klasse überschrieben werden, um die internen Felder der Klasse auf Gültigkeit zu testen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Example for CObject::AssertValid.&lt;br /&gt;
void CAge::AssertValid() const&lt;br /&gt;
{&lt;br /&gt;
  CObject::AssertValid();&lt;br /&gt;
  ASSERT( m_years &amp;gt; 0 );&lt;br /&gt;
  ASSERT( m_years &amp;lt; 105 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* Robert W. Floyd: &amp;#039;&amp;#039;Assigning meanings to programs&amp;#039;&amp;#039;. In: &amp;#039;&amp;#039;Proceedings of Symposia in Applied Mathematics&amp;#039;&amp;#039;, Volume&amp;amp;nbsp;19, 1967, S.&amp;amp;nbsp;19–32.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html Assertions in Java] bei [[Oracle]]&lt;br /&gt;
* [https://www.boost.org/doc/libs/1_75_0/doc/html/boost_staticassert.html Assertions in C++ mit Boost]&lt;br /&gt;
* [https://zugang.sophist.de/webUMLGlossar.nsf/dc36430aca0c3527c1256e3800348f73/06ac1b56ee59cba6c1256e4f004d44a0?OpenDocument Übersetzungsvarianten von Assertion laut UML Glossar]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmiersprachelement]]&lt;/div&gt;</summary>
		<author><name>~2025-38741-3</name></author>
	</entry>
</feed>