登录
首页 >  Golang >  Go问答

处理 go vet 发出的“可能误用 unsafe.Pointer”警告的方法和建议

来源:stackoverflow

时间:2024-02-07 11:24:22 433浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《处理 go vet 发出的“可能误用 unsafe.Pointer”警告的方法和建议》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

有没有办法抑制 可能对特定行的 unsafe.pointer 的误用(例如通过注释?)。或者更好地修复我的具体示例中的代码?

我有一个 windows.trustee 结构,其内容由 windows api 调用填充。我想访问 trusteevalue 字段中的 *windows.sid 。我知道 trusteevalue 字段包含 *windows.sid 因为我执行此检查: entry.trustee.trusteeform == windows.trustee_is_sid && entry.trustee.multipletrusteeoperation == windows.no_multiple_trustee。我还检查 windows api 调用是否返回错误。

这是包含相关部分的代码片段

if entry.trustee.trusteeform == windows.trustee_is_sid && entry.trustee.multipletrusteeoperation == windows.no_multiple_trustee {
    sid := (*windows.sid)(unsafe.pointer(entry.trustee.trusteevalue)) // <--- this line results in "possible misuse of unsafe.pointer" warning by go vet in go 1.20.4
    fmt.println(sid.string())
}

很明显,该警告是误报。我想抑制此行的警告,但仍然会在其他可能无意中误用 unsafe.pointer 的地方收到警告。

(在网络上和 copilot 上)有一些建议我添加注释,例如 //nolint:govet//lint:ignore//lint:ignore sa1015nolint

提前非常感谢您的帮助。

我编写了一个简短而完整的 golang 程序,用与已删除的问题无关的代码来重现我的问题。请注意,由于此访问 windows api,因此该程序将仅在 windows 上运行。程序循环“c:\windows”文件夹上的访问控制条目并打印 sid

package main

import (
    "fmt"
    "log"
    "unsafe"

    "golang.org/x/sys/windows"
)

var (
    modadvapi32                    = windows.NewLazySystemDLL("advapi32.dll")
    procGetExplicitEntriesFromAclW = modadvapi32.NewProc("GetExplicitEntriesFromAclW")
)

func main() {
    filename := "C:\\Windows"

    sd, err := windows.GetNamedSecurityInfo(filename, windows.SE_FILE_OBJECT, windows.DACL_SECURITY_INFORMATION)
    if err != nil {
        log.Fatalf("failed to get security descriptor: %v", err)
    }

    dacl, _, err := sd.DACL()
    if err != nil {
        log.Fatalf("failed to get DACL: %v", err)
    }

    var entriesCount uint32
    var entries *windows.EXPLICIT_ACCESS

    ret, _, err := procGetExplicitEntriesFromAclW.Call(uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(&entriesCount)), uintptr(unsafe.Pointer(&entries)))
    if ret != 0 {
        log.Fatalf("failed to get explicit entries from ACL: %v", err)
    }
    defer windows.LocalFree(windows.Handle(uintptr(unsafe.Pointer(entries))))

    accessControlEntries := unsafe.Slice(entries, entriesCount)
    for _, entry := range accessControlEntries {
        if entry.Trustee.TrusteeForm == windows.TRUSTEE_IS_SID && entry.Trustee.MultipleTrusteeOperation == windows.NO_MULTIPLE_TRUSTEE {
            sid := (*windows.SID)(unsafe.Pointer(entry.Trustee.TrusteeValue)) // <--- this line results in "possible misuse of unsafe.Pointer" warning by go vet in go 1.20.4
            fmt.Println(sid.String())
        }
    }

}


正确答案


如果您使用 vscode,您可以创建设置来忽略此误报。

路径:

{
   "go.useLanguageServer": true, // if this is true, needs gopls/analyses flag.
    "go.vetFlags": [
        "-unsafeptr=false"
    ],
    "gopls": {
        "analyses": { "unsafeptr": false }
    }
}

到这里,我们也就讲完了《处理 go vet 发出的“可能误用 unsafe.Pointer”警告的方法和建议》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>