首页 > 解决方案 > 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()

实际的恐慌来自func packEface内部reflect/value.go发生以下情况:

switch {
    case ifaceIndir(t):
        if v.flag&flagIndir == 0 {   // here v.flag = 22 and flagIndir = 128
            panic("bad indir")
        }
        ...

看起来我在这里做的事情是不正确的,还是更有可能这是引入的错误1.15.4

标签: goreflectioncgo

解决方案


我向 Golang GitHub 报告了这个问题

经过进一步调查,在 C 代码中,GEOSGeometry被定义为不完整的结构类型:

typedef struct GEOSGeom_t GEOSGeometry;

开发人员创建了一个补丁,以便在更好的地方失败,而不是在调用时随机恐慌Interface()


推荐阅读