Pergi melaporkan doktor haiwan 'Kemungkinan penyalahgunaan reflect.SliceHeader'

WBOY
Lepaskan: 2024-02-11 12:09:24
ke hadapan
1060 orang telah melayarinya

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

Editor PHP Zimo membawakan anda berita tentang laporan doktor haiwan Go hari ini. Baru-baru ini, pegawai bahasa Go mengeluarkan amaran yang menyatakan bahawa mungkin terdapat penyalahgunaan reflect.SliceHeader. Go vet ialah alat analisis statik dalam bahasa Go, digunakan untuk menyemak ralat biasa dan kemungkinan masalah dalam kod. Laporan itu menasihatkan pembangun supaya berhati-hati apabila menggunakan reflect.SliceHeader untuk mengelakkan masalah yang mungkin berlaku. Dalam artikel ini, kami akan menerangkan masalah ini secara terperinci dan memberikan penyelesaian yang sepadan.

Kandungan soalan

Saya mempunyai coretan kod berikut dan "pergi doktor haiwan" mengadu tentang amaran "Kemungkinan penyalahgunaan reflect.sliceheader". Saya tidak dapat mencari maklumat lanjut tentang amaran ini selain daripada ini. Selepas membaca ini saya tidak pasti apa yang perlu dilakukan untuk membuat pergi doktor haiwan gembira - dan tidak mempunyai masalah gc yang mungkin.

Matlamat coretan kod ini adalah untuk membolehkan fungsi go menyalin data ke dalam memori yang diuruskan oleh perpustakaan c legap. Fungsi go memerlukan []bait sebagai 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")
        }
        ...
}
Salin selepas log masuk

Penyelesaian

Nampaknya jimb (daripada komen) membayangkan jawapan yang paling betul, walaupun dia tidak menyiarkannya sebagai jawapan atau menyertakan contoh. Yang berikut lulus doktor haiwan, staticcheck dan golangci-lint - dan tidak segfault, jadi saya fikir ini adalah jawapan yang betul.

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")
        }
        ...
}
Salin selepas log masuk

Atas ialah kandungan terperinci Pergi melaporkan doktor haiwan 'Kemungkinan penyalahgunaan reflect.SliceHeader'. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!