go
system_error
ai_generated
true
错误:cgo:C函数返回错误:errno 2
error: cgo: C function returned error: errno 2
ID: go/cgo-errno-handling
80%修复率
85%置信度
0证据数
2025-01-10首次发现
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| 1.18 | active | — | — | — |
| 1.19 | active | — | — | — |
根因分析
C函数在失败时设置`errno`,但Go代码未检查,导致静默失败。
English
C function sets `errno` on failure, but Go code does not check it, leading to silent failures.
解决方案
-
90% 成功率 Check return value and use `C.CString` to get error message
ret := C.someCFunction() if ret != 0 { errno := C.errno errStr := C.GoString(C.strerror(errno)) return fmt.Errorf("C error: %s", errStr) } -
80% 成功率 Use `cgo.Handle` to capture error in a thread-safe way
// Not directly applicable; use mutex to protect errno reading
无效尝试
常见但无效的做法:
-
Ignoring the return value of C function
90% 失败
No error handling at all.
-
Using `C.errno` directly without thread safety
60% 失败
errno is thread-local in C, but Go may not preserve it.