Welchen Zweck haben die Umwandlungen, um int in glibc memmove zu signieren?

9

Quellcode

Da machen sie

%Vor%

Ich verstehe, warum sie überhaupt die Mühe machen, Longs zu Castings zu machen: Sie sollen Undefiniertes Verhalten vermeiden, indem sie Zeiger auf (wahrscheinlich) andere Objekte vergleichen. Und sie müssen offensichtlich unsigned longs verwenden, um den tatsächlichen Vergleich durchzuführen.

Aber warum werden sie zuerst in long int umgewandelt, dann implizit in unsigned long int ?

    
John Smith 08.03.2016, 19:46
quelle

2 Antworten

1

Erstens sind die in die Funktion übergebenen Parameter vom Typ void* und const void* . Um die Adressen vergleichbar zu ermitteln, werden sie auf einen Integer-Typ ( long int ) umgesetzt. Diese erste Umwandlung führt eine Integer-Konvertierung durch, so dass die void* -Zeiger numerisch verglichen werden können.

Zweitens können einige Nicht-ANSI-Compiler implizite Umwandlungen von void* in Integer-Typen auf eine nicht einheitliche Art und Weise implementieren und dabei etwas an Genauigkeit verlieren. Auf vielen Plattformen ist die Größe von long identisch mit der Größe von void* (obwohl dies nicht für alle Plattformen gilt), und das Umwandeln von void* in long ist ein geeigneter Weg eine Adresse darstellen.

Drittens dient die Konvertierung von long int nach unsigned long int zwei Zwecken: Sie stellt sicher, dass große Adressen während des Vergleichs nicht als negative Zahlen verwechselt werden, und ermöglicht eine bessere Sicherheit für Nicht-ANSI-Compiler. Die Funktion, auf die Sie in Ihrem Code verweisen, beschäftigt sich mit der Speicherausrichtung und überlappenden Speicherbereichen in dest und src und bestimmt, ob die Speicherbewegung vom Anfang zum Ende oder vom Ende zum Anfang gehen wird. Vorzeichenlose Vergleiche werden hier verwendet, um die Möglichkeit von überlappenden Speicherbereichen besser zu bewerten und sie entsprechend zu behandeln.

Einige Nicht-ANSI-Compiler konvertieren möglicherweise nicht direkt von void* in unsigned long int (abhängig von der Implementierung) und können den Zeiger abschneiden. Bei der Umwandlung von void* in long int in unsigned long int sollte die Bitdarstellung in jedem Schritt beibehalten werden, damit die tatsächliche Adresse nicht beschädigt wird.

    
callyalater 08.03.2016 21:10
quelle
-2

Jemand, der eine Zeichenfolge mit einer ungeraden Länge kopiert, kopiert etwa 613 Bytes, aber memcpy () wird in 32-Bit-Chunks für Geschwindigkeit implementiert.

Einige ältere Prozessoren wie der 68000 stürzen ab, wenn Sie eine 32-Bit-Ganzzahl in eine ungerade Adresse schreiben.

Das Casting ist aus Sicherheitsgründen erfolgt. Die Arbeit wird vom Assembler erledigt, indem zusätzliche Pad-Bytes hinzugefügt werden, um dies zu verhindern.

    
Arif Burhan 08.03.2016 19:54
quelle

Tags und Links