Typsicherheit

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Typsicherheitist ein Begriff aus derInformatik,speziell aus dem BereichProgrammiersprachen.Er bezeichnet den Zustand (einer Programmausführung), bei dem dieDatentypengemäß ihren Definitionen in der benutzten Programmiersprache verwendet werden und keineTypverletzungenauftreten.

Typsicherheit herzustellen ist Aufgabe desCompilersbeziehungsweise desInterpreters.Als Typprüfung bezeichnet man dabei den Vorgang, die Verwendung vonDatentypeninnerhalb desTypsystemszu prüfen, um etwaige Typverletzungen festzustellen.

Hierbei müssen beispielsweise beiZuweisungendie beteiligten Typen nicht notwendig identisch sein, daganze Zahlenunter UmständenGleitkommavariablenzugewiesen werden können. Die beteiligten Typen müssen aberzuweisungskompatibelsein.

Werden dementsprechende Typfehler spätestens zurLaufzeiterkannt, spricht man von „typsicheren Programmiersprachen “.

Bei derSoftware-Entwicklunggilt statische Typsicherheit als ein wesentlicher Faktor, der die Code-Qualität und die Zuverlässigkeit des entwickeltenProgrammserhöht. So weisen typsichere Programme eine hoheBetriebssicherheitundInformationssicherheitauf.[1]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 verbreiteteProgrammierspracheCist im Gegensatz zur ebenfalls sehr verbreiteten ProgrammierspracheJavanur begrenzt typsicher. Es wird daher häufig die Ansicht vertreten, dass weniger erfahrene oder unaufmerksameProgrammiererin C fehlerhaften oder leichtangreifbarenProgrammcodeerzeugen können.[2]

Statische und dynamische Typsicherheit

[Bearbeiten|Quelltext bearbeiten]

Bei dentypisiertenProgrammiersprachengibt es solche mit Typprüfungen während derKompilierung(statisch typisiert) und solche, bei denen strenge Typprüfungen erst zurLaufzeitstattfinden können (dynamisch typisiert), wie zum Beispiel beiSmalltalk.Ersteres Konzept erzeugt schneller ablaufendenProgrammcode,der insbesondere für größereSoftware-Systemeerforderlich ist,[3]letzteres erlaubt effizientere und flexiblereDatenmodellierung,wie zum Beispiel bei derobjektorientierten Programmierung.Viele moderne Programmiersprachen wie zum BeispielOberon[4]oderC#unterstützen daher beide Konzepte.[5]

Die folgenden Beispiele veranschaulichen, wie Umwandlungsoperatoren in derProgrammierspracheC++bei falscher Verwendung die Typsicherheit beeinträchtigen können. Das erste Beispiel zeigt, wie grundlegendeDatentypenfalsch umgewandelt werden können:

#include<iostream>
usingnamespacestd;

intmain()
{
intival=5;// integer
floatfval=reinterpret_cast<float&>(ival);// reinterpret Bitmuster
cout<<fval<<endl;// Gibt integer als float aus
return0;
}

In diesem Beispiel verhindertreinterpret_castexplizit, dass derCompilereine sichere Konvertierung von einer ganzen Zahl in einen Gleitkommawert durchführt.[6]Wenn dasProgrammausgeführt wird, gibt es einen Garbage-Floating-Point-Wert aus. Das Problem hätte vermieden werden können, indem stattdessenfloat fval = ivalgeschrieben würde. Das nächste Beispiel zeigt, wie Objektreferenzen falsch umgewandelt werden können:

#include<iostream>
usingnamespacestd;

classParent
{
public:
virtual~Parent(){}// Virtueller Destruktor für RTTI
};

classChild1:publicParent
{
public:
inta;
};

classChild2:publicParent
{
public:
floatb;
};

intmain()
{
Child1c1;
c1.a=5;
Parent&p=c1;// Der upcast ist immer sicher
Child2&c2=static_cast<Child2&>(p);// Ungültiger downcast
cout<<c2.b<<endl;// Gibt Datenmüll aus
return0;
}

Die beidenChild-Klassen haben Member unterschiedlicherTypen.Wenn Sie einenParent-Klassenzeiger auf einen untergeordneten Klassenzeiger übertragen, zeigt der resultierendeZeigermöglicherweise nicht auf ein gültigesObjektdes richtigen Typs. Im Beispiel führt dies dazu, dass der Datenmüll ausgegeben wird. Das Problem hätte vermieden werden können, indemstatic_castdurchdynamic_castersetzt wurde, das bei ungültigen Umwandlungen eine Ausnahme auslöst.[7]

  1. Hans J. Schneider:Geschichte der Programmiersprachen(MementodesOriginalsvom 9. Juli 2016 imInternet Archive)Info:Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäßAnleitungund entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www2.cs.fau.de,Friedrich-Alexander-Universität Erlangen-Nurnberg (2012), abgerufen am 9. Juli 2016
  2. Aaron Greenhouse:A Programmer-Oriented Approach to Safe Concurrency,Carnegie Mellon University Pittsburgh (Mai 2003), abgerufen am 9. Juli 2016
  3. Hanspeter Mössenböck:Object-Oriented Programming in Oberon-2,siehe auch Stichwort "Smalltalk", abgerufen am 9. Juli 2016
  4. Hanspeter Mössenböck,Niklaus Wirth:The Programming Language Oberon-2,Institut für Computersysteme, ETH Zürich (Oktober 1993), abgerufen am 9. Juli 2016
  5. Hanspeter Mössenböck:Object-oriented Programming in Oberon(MementodesOriginalsvom 27. September 2016 imInternet Archive)Info:Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäßAnleitungund entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/ statlab.uni-heidelberg.de,ETH Zürich, Institut für Computersysteme (19. November 1997), abgerufen am 9. Juli 2016
  6. cppreference:reinterpret_cast conversion
  7. cppreference:dynamic_cast conversion