Maison  >  Article  >  développement back-end  >  Go vet signale "Utilisation abusive possible de Reflect.SliceHeader"

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

WBOY
WBOYavant
2024-02-11 12:09:241030parcourir

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")
        }
        ...
}

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")
        }
        ...
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer