C ++ Vorlage für sichere Integer-Umwandlungen

8

Ich versuche, eine C ++ - Template-Funktion zu schreiben, die eine Laufzeitausnahmebedingung für Integer-Überläufe in Umwandlungen zwischen verschiedenen ganzzahligen Typen mit unterschiedlichen Breiten und möglichen Unsigned / Unsigned Mismatch auslöst. Für diese Zwecke geht es nicht um das Umwandeln von Gleitkommatypen in Ganzzahltypen oder andere Objekt-Objekt-Konvertierungen. Ich würde dies gerne tun, ohne viel Spezialcode schreiben zu müssen. Das habe ich derzeit:

%Vor%

Ist das korrekt und effizient?

EDIT: Aus verschiedenen Gründen ist stl nicht verfügbar, also kann ich nicht std :: numeric_limits verwenden, und alles von Boost ist direkt out.

    
JSBձոգչ 15.06.2009, 21:48
quelle

9 Antworten

5

Haben Sie SafeInt ausprobiert? Es ist eine plattformübergreifende Vorlage, die Integer-Überlaufprüfungen für eine Vielzahl von Integertypen durchführt. Es ist verfügbar auf GitHub

JaredPar 15.06.2009, 22:12
quelle
12

Sie können die minimalen und maximalen sicheren Werte (und eine ganze Menge anderer Informationen) für jeden fundamentalen Typ mit der std::numeric_limits Vorlage, z. %Code%. Sie müssen std::numeric_limits<T>::max() einfügen.

Referenz: Ссылка

    
Tyler McHenry 15.06.2009 21:51
quelle
11

Ist Boost eine Option? Wenn ja, versuchen Sie boost :: numeric_cast & lt; & gt; . Es scheint die gewünschten Eigenschaften zu bieten.

    
Void 15.06.2009 22:10
quelle
7

Ich denke, dass diese jetzt funktionieren, unabhängig davon, ob Sie Zweierkomplement verwenden oder nicht. Bitte testen Sie ausführlich, bevor Sie es verwenden. Sie geben die folgenden Ergebnisse. Jede Zeile gibt einen Assertionsfehler (ändern Sie sie einfach in Ausnahmen)

%Vor%

Implementierung. Zuerst einige Dienstprogramme, um nach ganzzahligen Rängen zu suchen (Typen mit höheren Rängen können Werte von Typen mit niedrigerem Rang enthalten, wenn das gleiche Vorzeichen gegeben wird. Und einige Promotion-Tools, um einen gemeinsamen, sicheren Typ herausfinden zu können ergibt einen signierten Typ, wenn ein vorzeichenloser Typ beteiligt ist, wenn der signierte Typ nicht alle Werte des unsignierten Typs speichern kann.)

%Vor%

Die Umwandlungsvorlagen nutzen diese, um für jeden Fall herauszufinden, was getan oder nicht getan werden muss.

%Vor%     
Johannes Schaub - litb 15.06.2009 23:39
quelle
3

Wie wäre es mit:

%Vor%

Dann überprüfst du nur, ob das Casting funktioniert hat. Stellen Sie sicher, dass Sie zurückbekommen, womit Sie begonnen haben, und dass das Zeichen nicht umgedreht wurde.

BEARBEITEN: Da der Kommentar unten durcheinander geraten ist, hier ist es, formatiert:

%Vor%

Die Besetzung von int nach char funktioniert gut. Der Cast von Char auf unsigned Char löst eine Ausnahme aus (wie es sollte). Ich sehe hier kein Problem.

    
Tim 15.06.2009 23:51
quelle
1

Habe ich richtig angenommen, dass in dem Fall, dass R signiert ist, Sie versuchen, rMax mit allen 1en außer dem letzten Bit zu füllen? Wenn das der Fall ist, sollten Sie 0x80 (1000 0000) anstelle von 0x10 (0001 0000) haben.

Es sieht auch nicht so aus, als ob Ihre Funktion negative Zahlen für die Quelle unterstützt.

Bearbeiten:

Hier ist eine leicht bearbeitete Version, die ich für die Konvertierung von Ints in Zeichen getestet habe:

%Vor%

Bearbeiten: Fehler behoben.

    
Niki Yoshiuchi 15.06.2009 22:15
quelle
0

Ich habe einen einzelnen Header im sweet.hpp namens conv.hpp . Es testet die Grenzen für alle Integer-Typen und erlaubt auch String-Casts für Integer.

%Vor%     
burner 18.02.2014 10:06
quelle
0

betrachten Sie Safe Numerics unter Ссылка

Diese Bibliothek bietet Drop-In-Ersetzungen für alle C-primitiven Integer-Typen. C-Vorgänge, die zu fehlerhaften Ergebnissen führen - einschließlich des Gießens - werden beim Erkennen abgefangen.

    
Robert Ramey 06.11.2014 21:26
quelle
0

Ich muss etwas vermissen, aber ist das nicht das, was du willst?:

%Vor%     
sly 16.06.2009 04:58
quelle