Ich verwende Perl für eine sicherheitsbezogene Aufgabe und frage mich, wann eine Aussage wie folgt lautet:
$test = "new value"
wird ausgeführt, ist der alte Wert, den $test
erstellt hat, im RAM überschrieben?
Wenn nicht, gibt es eine Möglichkeit, dies zu erzwingen?
Wenn der Skalar nicht magisch ist und über einen Zeichenfolgenpuffer verfügt und die Zeichenfolge in den Zeichenfolgenpuffer passt, wird dieser Teil des Zeichenfolgenpuffers überschrieben.
Beachten Sie, dass
%Vor%lässt "xxx \ 0ef \ 0" im Skalarpuffer stehen. Sie möchten die Länge des Puffers und nicht die Länge der Zeichenfolge im Puffer.
Ich wollte sagen, dass keiner
%Vor%wirkt sich auf den String-Puffer aus. Es wird nicht einmal freigegeben. In ähnlicher Weise wirkt sich das Zuweisen einer Zeichenfolge zu einem Skalar nicht auf die anderen Felder des Skalars aus, z. B. Felder, die Zahlen enthalten.
Ich habe vergessen, dass, wenn die Zeichenfolge, die dem Skalar zugewiesen wird, ein TEMP
ist, der Puffer des Ziels ersetzt wird, anstatt überschrieben zu werden.
Sie können das Modul Devel :: Peek verwenden, um diese Art von Fragen zu beantworten:
%Vor%In diesem Fall erhalten Sie:
%Vor% Man kann leicht sehen, dass die Adresse in diesem Fall gleich geblieben ist. Wenn Ihre Zeichenfolge länger als die Puffer LEN
ist, werden die Daten wie folgt neu zugewiesen:
ergibt (siehe den Zeiger neben PV
geändert):
Ich denke, es hängt davon ab, was der vorherige Wert von $test
war.
Wenn zum Beispiel der neue Wert länger ist, muss Perl realloc () (oder etwas Ähnliches) aufrufen, was ändern kann, wo die Zeichenfolge gespeichert wird.
Im Allgemeinen scheinen die Perl-String-Operationen den gleichen Speicher zu verwenden, obwohl dies meiner Meinung nach nicht garantiert ist.
Sie können die Adresse des String-Puffers eines Skalars unpack('J', pack('P', $s))
erhalten. Dies funktioniert nicht, wenn der Skalar keine Zeichenfolge enthält (selbst wenn er einen Zeichenfolgenpuffer hat).
Tags und Links perl variables scalar data-persistence