Wenn Sie bei "encoding/binary" Paket aussehen:ist es notwendig, zu früh Grenzen zu überprüfen, um die Sicherheit der Schreibvorgänge in Golang zu garantieren?
func (littleEndian) Uint64(b []byte) uint64 {
_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
}
func (littleEndian) PutUint64(b []byte, v uint64) {
_ = b[7] // early bounds check to guarantee safety of writes below
b[0] = byte(v)
b[1] = byte(v >> 8)
b[2] = byte(v >> 16)
b[3] = byte(v >> 24)
b[4] = byte(v >> 32)
b[5] = byte(v >> 40)
b[6] = byte(v >> 48)
b[7] = byte(v >> 56)
}
Sie werden sehen:
_ = b[7] // early bounds check to guarantee safety of writes below
nun diesen Beispielcode A betrachten (siehe Kommentar):
package main
import "fmt"
func main() {
b := []byte{0, 1, 2, 3, 4, 5, 6}
var v uint64 = 0x0807060504030201
b[0] = byte(v)
b[1] = byte(v >> 8)
b[2] = byte(v >> 16)
b[3] = byte(v >> 24)
b[4] = byte(v >> 32)
b[5] = byte(v >> 40)
b[6] = byte(v >> 48)
b[7] = byte(v >> 56) // panic: runtime error: index out of range
fmt.Println(b)
}
Und Dieser Beispielcode B (siehe Kommentar):
package main
import "fmt"
func main() {
b := []byte{0, 1, 2, 3, 4, 5, 6}
var v uint64 = 0x0807060504030201
b[7] = byte(v >> 56) // panic: runtime error: index out of range
b[6] = byte(v >> 48)
b[5] = byte(v >> 40)
b[4] = byte(v >> 32)
b[3] = byte(v >> 24)
b[2] = byte(v >> 16)
b[1] = byte(v >> 8)
b[0] = byte(v)
fmt.Println(b)
}
Und Beispielcode C:
package main
import "fmt"
func main() {
b := []byte{0, 1, 2, 3, 4, 5, 6}
var v uint64 = 0x0807060504030201
_ = b[7] // early bounds check to guarantee safety of writes below
b[0] = byte(v)
b[1] = byte(v >> 8)
b[2] = byte(v >> 16)
b[3] = byte(v >> 24)
b[4] = byte(v >> 32)
b[5] = byte(v >> 40)
b[6] = byte(v >> 48)
b[7] = byte(v >> 56)
fmt.Println(b)
}
So habe ich zwei Fragen:
Q1: Ist es notwendig, frühzeitig Überprüfung von Grenzen in Golang Sicherheit schreibt zu gewährleisten?
Q2: Für frühe Grenzen zu überprüfen, um die Sicherheit der Schreibvorgänge zu gewährleisten, die Beispielcode ist prägnanter und leistungsoptimiert (Geschwindigkeit), Beispielcode A, B, C oder ...?
A2: Ich denke B: weil es prägnant ist und frühe Grenzen überprüfen, nicht wahr?
Nein, die Überprüfung der frühen Grenzen ist für die Speichersicherheit nicht erforderlich. Diese Überprüfung der Anfangsbegrenzung dient nur dazu, dass ein Compiler-Hinweis in der Lage ist, weitere Begrenzungsüberprüfungen zu vermeiden (und es gab einige Diskussionen, ob dies überhaupt ein ermutigtes Muster sein sollte). Alle Indexvorgänge sind speicherfrei, es sei denn, Sie verwenden das unsichere Paket. – JimB
Das habe ich im ersten Satz gesagt; Der Compiler fügt in vielen Fällen die Schrankenprüfung für Sie ein und Sie brauchen nicht immer eine Überprüfung der frühen Schranken. Tut mir leid, wenn das unklar war; Ich werde es überarbeiten. –
Hoffentlich ist das klarer. –