github.com/epfl-dcsl/gotee@v0.0.0-20200909122901-014b35f5e5e9/misc/cgo/testplugin/src/issue18676/main.go (about)

     1  // Copyright 2017 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // The bug happened like this:
     6  // 1) The main binary adds an itab for *json.UnsupportedValueError / error
     7  //    (concrete type / interface type).  This itab goes in hash bucket 0x111.
     8  // 2) The plugin adds that same itab again.  That makes a cycle in the itab
     9  //    chain rooted at hash bucket 0x111.
    10  // 3) The main binary then asks for the itab for *dynamodbstreamsevt.Event /
    11  //    json.Unmarshaler.  This itab happens to also live in bucket 0x111.
    12  //    The lookup code goes into an infinite loop searching for this itab.
    13  // The code is carefully crafted so that the two itabs are both from the
    14  // same bucket, and so that the second itab doesn't exist in
    15  // the itab hashmap yet (so the entire linked list must be searched).
    16  package main
    17  
    18  import (
    19  	"encoding/json"
    20  	"issue18676/dynamodbstreamsevt"
    21  	"plugin"
    22  )
    23  
    24  func main() {
    25  	plugin.Open("plugin.so")
    26  
    27  	var x interface{} = (*dynamodbstreamsevt.Event)(nil)
    28  	if _, ok := x.(json.Unmarshaler); !ok {
    29  		println("something")
    30  	}
    31  }