# Typsicherheit

Typsicherheit ist ein Begriff aus der Informatik, speziell aus dem Bereich Programmiersprachen. Er bezeichnet den Zustand (einer Programmausführung), bei dem die Datentypen gemäß ihren Definitionen in der benutzten Programmiersprache verwendet werden und keine Typverletzungen auftreten.

## Beschreibung

Typsicherheit herzustellen ist Aufgabe des Compilers beziehungsweise des Interpreters. Als Typprüfung bezeichnet man dabei den Vorgang, die Verwendung von Datentypen innerhalb des Typsystems zu prüfen, um etwaige Typverletzungen festzustellen.
Hierbei müssen beispielsweise bei Zuweisungen die beteiligten Typen nicht notwendig identisch sein, da ganze Zahlen unter Umständen Gleitkommavariablen zugewiesen werden können. Die beteiligten Typen müssen aber zuweisungskompatibel sein.
Werden dementsprechende Typfehler spätestens zur Laufzeit erkannt, spricht man von „typsicheren Programmiersprachen“.

## Nutzen

Bei der Software-Entwicklung gilt statische Typsicherheit als ein wesentlicher Faktor, der die Code-Qualität und die Zuverlässigkeit des entwickelten Programms erhöht. So weisen typsichere Programme eine hohe Betriebssicherheit und Informationssicherheit auf. Zudem erleichtert statische Typisierung den Arbeitsfluss beim Code-Refactoring. Gelegentlich wird argumentiert, dass die Aspekte der Typsicherheit ebenfalls durch eine ausreichende Testabdeckung nachgewiesen werden können.
Die weit verbreitete Programmiersprache C ist im Gegensatz zur ebenfalls sehr verbreiteten Programmiersprache Java nur begrenzt typsicher. Es wird daher häufig die Ansicht vertreten, dass weniger erfahrene oder unaufmerksame Programmierer in C fehlerhaften oder leicht angreifbaren Programmcode erzeugen können.

## Statische und dynamische Typsicherheit

Bei den typisierten Programmiersprachen gibt es solche mit Typprüfungen während der Kompilierung (statisch typisiert) und solche, bei denen strenge Typprüfungen erst zur Laufzeit stattfinden können (dynamisch typisiert), wie zum Beispiel bei Smalltalk. Ersteres Konzept erzeugt schneller ablaufenden Programmcode, der insbesondere für größere Software-Systeme erforderlich ist, letzteres erlaubt effizientere und flexiblere Datenmodellierung, wie zum Beispiel bei der objektorientierten Programmierung. Viele moderne Programmiersprachen wie zum Beispiel Oberon oder C# unterstützen daher beide Konzepte.

## Beispiele
### C++

Die folgenden Beispiele veranschaulichen, wie Umwandlungsoperatoren in der Programmiersprache C++ bei falscher Verwendung die Typsicherheit beeinträchtigen können. Das erste Beispiel zeigt, wie grundlegende Datentypen falsch umgewandelt werden können:
In diesem Beispiel verhindert reinterpret_cast explizit, dass der Compiler eine sichere Konvertierung von einer ganzen Zahl in einen Gleitkommawert durchführt. Wenn das Programm ausgeführt wird, gibt es einen Garbage-Floating-Point-Wert aus. Das Problem hätte vermieden werden können, indem stattdessen float fval = ival geschrieben würde.
Das nächste Beispiel zeigt, wie Objektreferenzen falsch umgewandelt werden können:
Die beiden Child-Klassen haben Member unterschiedlicher Typen. Wenn Sie einen Parent-Klassenzeiger auf einen untergeordneten Klassenzeiger übertragen, zeigt der resultierende Zeiger möglicherweise nicht auf ein gültiges Objekt des richtigen Typs. Im Beispiel führt dies dazu, dass der Datenmüll ausgegeben wird. Das Problem hätte vermieden werden können, indem static_cast durch dynamic_cast ersetzt wurde, das bei ungültigen Umwandlungen eine Ausnahme auslöst.