Heim >Backend-Entwicklung >Golang >Der Tierarzt meldet „Möglicher Missbrauch von Reflect.SliceHeader'

Der Tierarzt meldet „Möglicher Missbrauch von Reflect.SliceHeader'

WBOY
WBOYnach vorne
2024-02-11 12:09:241089Durchsuche

Go vet 报告“可能滥用reflect.SliceHeader”

PHP-Redakteur Zimo bringt Ihnen heute Neuigkeiten zum Go-Veterinärbericht. Kürzlich gab der Verantwortliche der Go-Sprache eine Warnung heraus, dass es zu einem Missbrauch von „reflect.SliceHeader“ kommen könnte. Go vet ist ein statisches Analysetool in der Go-Sprache, mit dem häufige Fehler und potenzielle Probleme im Code überprüft werden. Der Bericht rät Entwicklern, bei der Verwendung von „reflect.SliceHeader“ vorsichtig zu sein, um potenzielle Probleme zu vermeiden. In diesem Artikel werden wir dieses Problem im Detail erläutern und entsprechende Lösungen anbieten.

Frageinhalt

Ich habe den folgenden Codeausschnitt und „go vet“ beschwert sich über die Warnung „Möglicher Missbrauch von Reflect.sliceheader“. Ich kann keine weiteren Informationen zu dieser Warnung finden. Nachdem ich das gelesen habe, bin ich mir nicht ganz sicher, was getan werden muss, damit ich glücklich zum Tierarzt gehe – und keine möglichen Probleme mit der Blutzuckerkontrolle habe.

Das Ziel dieses Codeausschnitts besteht darin, dass die Go-Funktion Daten in den Speicher kopiert, der von der undurchsichtigen C-Bibliothek verwaltet wird. Die Go-Funktion benötigt ein []Byte als Parameter.

func Callback(ptr unsafe.Pointer, buffer unsafe.Pointer, size C.longlong) C.longlong {
        ...
        sh := &reflect.SliceHeader{
                Data: uintptr(buffer),
                Len:  int(size),
                Cap:  int(size),
        }
        buf := *(*[]byte)(unsafe.Pointer(sh))
        err := CopyToSlice(buf)
        if err != nil {
           log.Fatal("failed to copy to slice")
        }
        ...
}

Workaround

Es sieht so aus, als hätte Jimb (aus den Kommentaren) auf die richtigste Antwort hingewiesen, obwohl er sie nicht als Antwort gepostet oder ein Beispiel beigefügt hat. Das Folgende besteht vet, staticcheck und golangci-lint – und verursacht keine Segfaults, daher denke ich, dass dies die richtige Antwort ist.

func Callback(ptr unsafe.Pointer, buffer unsafe.Pointer, size C.longlong) C.longlong {
        ...
        buf := unsafe.Slice((*byte)(buffer), size)
        err := CopyToSlice(buf)
        if err != nil {
           log.Fatal("failed to copy to slice")
        }
        ...
}

Das obige ist der detaillierte Inhalt vonDer Tierarzt meldet „Möglicher Missbrauch von Reflect.SliceHeader'. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen