Was ist Typsicherheit und was sind die “typsicheren” Alternativen? [duplicate]

Lesezeit: 7 Minuten

Benutzer-Avatar
Dr Deo

Mögliche Duplikate:

Was ist typsicher?
Was ist Typsicherheit?

Ich habe über C++-Vektoren gelesen und das wurde erwähnt memcpy und printf Funktionen aus C sind nicht typsicher. Artikel hier: http://en.wikipedia.org/wiki/Vector_(C%2B%2B).

Frage: In einfachem Englisch, was ist Typsicherheit und was sind die “typsicheren” Alternativen?

  • Ich bin sicher, wir haben bereits Antworten auf Ihre beiden Fragen zu Stack Overflow in separaten Fragen. Werde nachschauen. Suchen Sie in der Zwischenzeit nach „type safety“ und „memset memcpy std::fill“ auf stackoverflow.

    – mmx

    26. Januar 2010 um 15:30 Uhr

  • Abstimmung zum Schließen als exaktes Duplikat: stackoverflow.com/questions/260626/what-is-type-safe stackoverflow.com/questions/928275/what-is-type-safety stackoverflow.com/questions/1899906/…

    – Sinan Ünür

    26. Januar 2010 um 15:52 Uhr

Benutzer-Avatar
CK Jung

Typsicherheit bedeutet, dass der Compiler prüfen kann, ob Sie die richtigen Typen verwenden. Wenn Sie beispielsweise verwenden printfkönnten Sie Ihr Programm versehentlich zum Absturz bringen, indem Sie Folgendes schreiben:

printf("The meaning of life is %s", 42);

weil 42 eine ganze Zahl ist, kein String.

  • boost.org/doc/libs/1_45_0/libs/format/doc/format.html

    – Roman A. Taycher

    7. Februar 2011 um 4:13 Uhr

  • Richtig; C++ ist ein schwach typisiertes System, da Sie im Wesentlichen jeden Typ, jeden anderen Typ, Ints in Bools und alles andere umwandeln können. C++ gibt dem Programmierer die vollständige Kontrolle über die Maschine; Speicher ist Speicher, und C++ wird Ihnen das Bein abblasen, weil es verlangt, dass Sie bei jedem einzelnen Schritt genau wissen, was Sie tun.

    – Adam Müller

    1. April 2013 um 12:13 Uhr

Benutzer-Avatar
csl

Geben Sie Sicherheit ein bedeutet, dass der Compiler dabei hilft zu überprüfen, ob Sie keine (inkompatiblen) Datentypen mischen.

Zum Beispiel, wenn Sie anrufen memcpy, sieht die Funktion (und der Compiler) nur zwei Zeiger im Speicher und beginnt fröhlich mit dem Kopieren von Daten. Dies bedeutet, dass Sie inkompatible Datentypen wie folgt mischen können:

SomeClass a;
AnotherClass b;
memcpy((void*)&a, (void*)&b, sizeof(b));

Es gibt viele Ansätze, Typsicherheit zu erreichen. Sie könnten Vorlagen verwenden und einen Wrapper um mempcy() erstellen, um sicherzustellen, dass die beiden Zeiger auf denselben Datentyp zeigen, oder Sie könnten andere Methoden verwenden.

Da Sie bereits Vektoren aus der STL verwenden, verwenden Sie bereits eine mehr oder weniger typsichere Implementierung.

Benutzer-Avatar
t0mm13b

Die Typsicherheit regelt die Verwendung des Compilers, der prüft, ob die Variable vom richtigen Typ ist. C ist sehr locker in Bezug auf die Sicherheit von Datentypen, dies ist beispielsweise tatsächlich in den ANSI-C-Standards enthalten, die besagen, dass eine Typförderung für Datentypen erfolgt charein Beispiel in dieser Aufgabe wird dies erläutern,

char ch = 32; /* that is a space character accordingly to ASCII */
int n = ch + 3;

Beachten Sie, wie die ch Variable wird zum Typ befördert int. Das ist legitim, erfordert aber eine genauere Betrachtung, wenn Sie das implizieren.

Compiler wie der C#-Compiler lassen dies nicht zu, das ist der Grund, warum in C beispielsweise der Cast-Operator verwendet wird:

int n = (int)3.1415926535f;

Nit wählerisch beiseite, das ist ein Pi-Wert, was passiert, ist das der Wert von n wird 3.

Das Obige dient zur Veranschaulichung der Typensicherheit und dass C diesbezüglich sehr locker ist.

Typsicherheit in modernen Sprachen ist strenger, wie Java, C#, um die Verwendung und Bedeutung der Variablen einzuschränken. PHP ist ein hervorragendes Beispiel für lose Typisierung, wo Sie dies tun könnten:

$myvar = 34;
$myvar = $myvar + "foo";

ist $myvar eine Ganzzahl, oder ist es ein Fließkomma oder ist es eine Zeichenfolge. Die Typsicherheit hier ist nicht sehr klar in Bezug auf die Absicht, die zu Fehlern und einer glücklichen Debugging-Sitzung führen kann, bei der versucht wird, herauszufinden, was passiert.

Hoffe das hilft

Da du sowieso auf Wikipedia warst: Geben Sie Sicherheit ein.

Typsicherheit bedeutet grob gesagt, dass die Sprache es Ihnen verbietet, Ihre Typen versehentlich zu verwechseln.

memcpy ist nicht typsicher, da Sie den Speicher einiger leicht kopieren können int in ein char Array und erhalten am Ende bedeutungslose Daten. printf ist nicht typsicher, weil Sie a angeben können %i Formatbezeichner mit einer Zeichenfolge; Auch hier wird die Zeichenfolge als interpretiert int und du wirst mit Müll enden. (Übrigens der VC++-Compiler tut Überprüfen Sie in einigen Situationen die Formatzeichenfolge.)

std::vector<T> ist typsicher, da Sie nur Werte des angegebenen Typs eingeben können T hinein. (Sie können natürlich explizite Typumwandlungen durchführen, aber der Punkt ist, dass Sie es sein müssen explizit etwas zu tun, das nicht typsicher ist).

Benutzer-Avatar
Onkel Bens

“Typsicherheit” bedeutet, dass der Compiler überprüft, ob Sie mit den richtigen Typen die richtigen Dinge tun (z. B. einen Compilerfehler auslöst, wenn Sie versuchen, eine Banane als Orange zu behandeln oder einer Funktion eine Zeichenfolge zu übergeben, die die Ausgabe einer Ganzzahl erwartet). .

Typsicherheit geht (meistens) direkt aus dem Fenster, wenn void* kommt ins Bild – es ist ein Zeiger, der auf alles zeigen kann (völlig unbewusst der beteiligten Typen), und die Sprache überlässt es vollständig den Händen des Programmierers (zum Beispiel a void* ist meistens für nichts gut, außer dafür, in den ursprünglichen Typ zurückversetzt zu werden; es kann alles darstellen, aber Sie müssen wissen, was es ist, bevor Sie es verwenden können).

Typunsicherheit spielt auch bei variadischen Funktionen wie printf eine Rolle (dem Compiler ist es egal, wie viele Argumente es gibt und welche Typen sie haben – auch hier ist es Sache des Aufrufers, sicherzustellen, dass der Formatstring mit den Argumenten und ihren Typen übereinstimmt). .

Typsichere Alternative zu memcpy (für Arrays und Container) könnte sein std::copy in <algorithm> – Es kann in Bezug auf memmove implementiert werden, wenn alle beteiligten Typen bestimmte Anforderungen erfüllen, andernfalls führt es Zuweisungen aus – Bei einigen Klassen können Sie bestimmte Invarianten brechen, wenn Sie ihre öffentliche Schnittstelle umgehen und sie einfach im Speicher verschieben / kopieren (z , ich nehme an, jede Klasse mit einem nicht trivialen Kopierkonstruktor wird sich schlecht benehmen, wenn Sie mit memcpy Kopien davon erstellen).

Typsichere Alternativen zu CI/O-Routinen sind iostreams (und wenn Sie die Vorteile des Format-Strings nutzen möchten, boost::format).

„Typsicherheit“ verwendet ein „Typsystem“, um sicherzustellen, dass Fehler nicht innerhalb von Programmen weitergegeben werden. Ohne Typsicherheit ist es beispielsweise möglich, (unbemerkt) auf unerwünschte Weise einen Zeichenfolgentyp zu einem Fließkommatyp hinzuzufügen.

In den Fällen, von denen Sie sprechen, memcpy() und printf(), ist der Mangel an Typsicherheit darauf zurückzuführen, wie die Funktionen ihre Argumente behandeln. Zum Beispiel mit memcpy(arg1, arg2, len)das len Bytes ab Speicheradresse arg2 wird an die Speicheradresse kopiert arg1egal wie viele Bytes arg1 weist darauf hin und überschreibt möglicherweise andere Teile Ihres Programms.

Suchen Sie nach typsicheren Alternativen Konstrukteure und cout.

In der Tat, Sehen Sie sich die gesamten C++ FAQ Lite an

Dies bedeutet, dass der Compiler keine Warnung generiert, wenn Sie versuchen, einen Typ auf eine Weise zu verwenden, die für diesen Typ keinen Sinn ergibt. Das folgende Beispiel ist ein undefiniertes Verhalten und kopiert in der Praxis die Bits eines Zeigers in die Bits eines Floats, wo sie absolut keinen Sinn machen. Wenn sizeof(char*) > sizeof(float)werden alle Speicherorte überschrieben, die sich gerade über wo befinden f lebt.

float f;
char *c = someString();
memcpy(&f, &c, sizeof(char*));

  • Tatsächlich ist es aus vielen Gründen ein undefiniertes Verhalten: Verwendung eines nicht initialisierten Werts c; könnte eine Trap-Darstellung in f erzeugen, was bei späterer Verwendung UB wäre; könnte den Puffer überlaufen, wie Sie es identifiziert haben.

    – Steve Jessop

    26. Januar 2010 um 17:05 Uhr

  • @Steve Jessop: Der nicht initialisierte Wert c war ein Fehler, nicht beabsichtigt. Ich habe es behoben, weil es für den eigentlichen Punkt ablenkend war. Danke für den Hinweis.

    – dsimcha

    26. Januar 2010 um 17:13 Uhr

1372230cookie-checkWas ist Typsicherheit und was sind die “typsicheren” Alternativen? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy