Maison > développement back-end > Golang > le corps du texte

Go vet signale 'Utilisation abusive possible de Reflect.SliceHeader'

WBOY
Libérer: 2024-02-11 12:09:24
avant
1060 Les gens l'ont consulté

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

Zimo, l'éditeur PHP, vous apporte aujourd'hui des nouvelles du rapport Go vet. Récemment, le responsable de la langue Go a émis un avertissement indiquant qu'il pourrait y avoir un abus de Reflect.SliceHeader. Go vet est un outil d'analyse statique dans le langage Go, utilisé pour vérifier les erreurs courantes et les problèmes potentiels dans le code. Le rapport conseille aux développeurs d'être prudents lorsqu'ils utilisent Reflect.SliceHeader pour éviter des problèmes potentiels. Dans cet article, nous expliquerons ce problème en détail et proposerons les solutions correspondantes.

Contenu de la question

J'ai l'extrait de code suivant et "Go Vet" se plaint de l'avertissement "Possible utilisation abusive de Reflect.sliceheader". Je ne trouve pas plus d'informations sur cet avertissement que ceci. Après avoir lu ceci, je ne suis pas sûr de ce qui doit être fait pour rendre le vétérinaire heureux - et ne pas avoir d'éventuels problèmes de GC.

Le but de cet extrait de code est de permettre à la fonction go de copier les données dans la mémoire gérée par la bibliothèque opaque c. La fonction go nécessite un []byte comme paramètre.

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")
        }
        ...
}
Copier après la connexion

Solution de contournement

Il semble que Jimb (d'après les commentaires) ait fait allusion à la réponse la plus correcte, bien qu'il ne l'ait pas publiée comme réponse ni inclus d'exemple. Ce qui suit passe par vet, staticcheck et golangci-lint - et ne comporte pas de défaut de segmentation, donc je pense que c'est la bonne réponse.

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")
        }
        ...
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!