{"record":{"id":"73bac9bfdd5b58e6","repo":"go-delve/delve","slug":"can-not-set-s-73bac9","errorCode":null,"errorMessage":"can not set %s","messagePattern":"can not set (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/proc/linutil/regs_amd64_arch.go","lineNumber":218,"sourceCode":"\n\tif p != nil {\n\t\tif reg.Bytes != nil && len(reg.Bytes) != 8 {\n\t\t\treturn false, fmt.Errorf(\"wrong number of bytes for register %s (%d)\", regnum.AMD64ToName(regNum), len(reg.Bytes))\n\t\t}\n\t\t*p = reg.Uint64Val\n\t\treturn false, nil\n\t}\n\n\tif r.loadFpRegs != nil {\n\t\terr := r.loadFpRegs(r)\n\t\tif err != nil {\n\t\t\treturn false, err\n\t\t}\n\t\tr.loadFpRegs = nil\n\t}\n\n\tif regNum < regnum.AMD64_XMM0 || regNum > regnum.AMD64_XMM0+15 {\n\t\treturn false, fmt.Errorf(\"can not set %s\", regnum.AMD64ToName(regNum))\n\t}\n\n\treg.FillBytes()\n\n\terr := r.Fpregset.SetXmmRegister(int(regNum-regnum.AMD64_XMM0), reg.Bytes)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n","sourceCodeStart":200,"sourceCodeEnd":229,"githubUrl":"https://github.com/go-delve/delve/blob/a23773e6c31361e43246bc43a424ee009679b174/pkg/proc/linutil/regs_amd64_arch.go#L200-L229","documentation":"After handling general-purpose registers, the amd64 SetReg only supports writing XMM0-XMM15 floating-point/SIMD registers. Any other register number (e.g. x87 st registers, segment descriptor bases, debug registers reachable only through other paths) is rejected with this error.","triggerScenarios":"Calling SetReg on Linux/amd64 with a register number outside the XMM0..XMM0+15 range and outside the general-purpose switch handled earlier (where p was nil and no fallback exists).","commonSituations":"Attempting to modify AVX YMM/ZMM registers, x87 control registers, or debug registers through the ptrace-backed SetReg path; using a register-number constant from a different architecture by mistake.","solutions":["Only call SetReg for registers it supports (GPRs and XMM0-XMM15); reject or no-op unsupported registers in the caller","Use the appropriate backend API if the register must be modified (e.g. ptrace POKEUSER on a specific offset, or a debugger feature that supports it)","Verify the register number constant belongs to regnum.AMD64_* and not another architecture"],"exampleFix":"// before\nthread.SetReg(regnum.AMD64_ST0, reg) // unsupported\n// after\nif regnum.AMD64_XMM0 <= regNum && regNum <= regnum.AMD64_XMM0+15 {\n    thread.SetReg(regNum, reg)\n} else {\n    return fmt.Errorf(\"register %s is not settable via SetReg\", regnum.AMD64ToName(regNum))\n}","handlingStrategy":"validation","validationCode":"if regNum < regnum.AMD64_XMM0 || regNum > regnum.AMD64_XMM0+15 {\n    isGPR := false // check against the supported GPR set first\n    if !isGPR {\n        return fmt.Errorf(\"register %s is not settable\", regnum.AMD64ToName(regNum))\n    }\n}","typeGuard":"func isSettableAMD64(regNum regnum.AMD64) bool {\n    return regNum <= regnum.AMD64_Rflags || (regNum >= regnum.AMD64_XMM0 && regNum <= regnum.AMD64_XMM0+15)\n}","tryCatchPattern":"if err := thread.SetReg(regNum, reg); err != nil {\n    var unsupported *regUnsupportedError\n    if strings.Contains(err.Error(), \"can not set\") {\n        return fmt.Errorf(\"skipping non-settable register %s\", regnum.AMD64ToName(regNum))\n    }\n    return err\n}","preventionTips":["Consult regnum.AMD64 constants and only write documented settable registers","Treat YMM/ZMM/x87/debug registers as read-only through this API","Guard register-write features with an architecture capability check"],"tags":["go","registers","amd64","xmm"],"backgroundTag":"register-not-settable","analyzedSha":"a23773e6c31361e43246bc43a424ee009679b174","analyzedAt":"2026-08-31T15:12:45.221Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}