Misuse of unsafe.Pointer

possible misuse of unsafe.Pointer (govet)

Quick Answer

unsafe.Pointer must follow specific conversion rules. Convert directly between pointer types in a single expression without intermediate uintptr storage.

Why This Happens

The unsafe.Pointer type allows bypassing Go's type system. However, storing a uintptr (the integer form of a pointer) in a variable is dangerous because the garbage collector does not track uintptr values. The original memory may be reclaimed. Always convert in a single expression.

The Problem

func getFieldPtr(s *MyStruct) *int {
    ptr := uintptr(unsafe.Pointer(s))
    ptr += unsafe.Offsetof(s.Field)
    // GC may move s between these lines!
    return (*int)(unsafe.Pointer(ptr))
}

The Fix

func getFieldPtr(s *MyStruct) *int {
    return (*int)(unsafe.Pointer(
        uintptr(unsafe.Pointer(s)) + unsafe.Offsetof(s.Field),
    ))
}

Step-by-Step Fix

  1. 1

    Identify the unsafe.Pointer usage

    Find code that stores uintptr values in variables before converting back to pointers.

  2. 2

    Combine into single expression

    Perform the entire pointer arithmetic in a single expression without intermediate uintptr variables.

  3. 3

    Consider safer alternatives

    Check if reflect or encoding/binary can achieve the same goal without unsafe.

Got the actual stack trace?

Paste it into our free AI explainer to get the cause and the fix for your specific case — no signup, nothing to install.

Explain my error

Bugsly catches this automatically

Bugsly's AI analyzes this error pattern in real-time, explains what went wrong in plain English, and suggests the exact fix — before your users even report it.

Try Bugsly free