反映 Value.Interface() 恐慌:v1.15.4 后 CGo 类型上的错误索引
Reflect Value.Interface() panic: bad indir on CGo type after v1.15.4
我正在使用一个名为 GEOS 的 C 库,它提供了一个 C 支持的实现来处理几何操作。在某些反射操作期间使用了包含此 C 类型的结构,但在升级到 Go v1.15.4(或之后的任何版本)后,这会导致恐慌。
我已经确定了问题,似乎在使用反射 Type
创建新反射 Value
时,随后调用 Interface()
会导致 panic: bad indir
:
var test *C.GEOSGeometry
reflectType := reflect.ValueOf(test).Type().Elem()
value := reflect.New(reflectType)
// Panics in 1.15.4+
value.Interface()
实际恐慌来自 reflect/value.go
内部的 func packEface
,其中发生以下情况:
switch {
case ifaceIndir(t):
if v.flag&flagIndir == 0 { // here v.flag = 22 and flagIndir = 128
panic("bad indir")
}
...
我在这里做的事情似乎不正确,或者这更有可能是 1.15.4
中引入的错误?
I reported the issue to the Golang GitHub
经过进一步调查,在 C 代码中,GEOSGeometry
被定义为不完整的结构类型:
typedef struct GEOSGeom_t GEOSGeometry;
开发人员创建了一个补丁,以便在更好的地方失败,而不是在调用 Interface()
时随机出现恐慌
我正在使用一个名为 GEOS 的 C 库,它提供了一个 C 支持的实现来处理几何操作。在某些反射操作期间使用了包含此 C 类型的结构,但在升级到 Go v1.15.4(或之后的任何版本)后,这会导致恐慌。
我已经确定了问题,似乎在使用反射 Type
创建新反射 Value
时,随后调用 Interface()
会导致 panic: bad indir
:
var test *C.GEOSGeometry
reflectType := reflect.ValueOf(test).Type().Elem()
value := reflect.New(reflectType)
// Panics in 1.15.4+
value.Interface()
实际恐慌来自 reflect/value.go
内部的 func packEface
,其中发生以下情况:
switch {
case ifaceIndir(t):
if v.flag&flagIndir == 0 { // here v.flag = 22 and flagIndir = 128
panic("bad indir")
}
...
我在这里做的事情似乎不正确,或者这更有可能是 1.15.4
中引入的错误?
I reported the issue to the Golang GitHub
经过进一步调查,在 C 代码中,GEOSGeometry
被定义为不完整的结构类型:
typedef struct GEOSGeom_t GEOSGeometry;
开发人员创建了一个补丁,以便在更好的地方失败,而不是在调用 Interface()