github.com/ice-blockchain/go/src@v0.0.0-20240403114104-1564d284e521/debug/dwarf/entry_test.go (about)

     1  // Copyright 2009 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  package dwarf_test
     6  
     7  import (
     8  	. "debug/dwarf"
     9  	"encoding/binary"
    10  	"path/filepath"
    11  	"reflect"
    12  	"testing"
    13  )
    14  
    15  func TestSplit(t *testing.T) {
    16  	// debug/dwarf doesn't (currently) support split DWARF, but
    17  	// the attributes that pointed to the split DWARF used to
    18  	// cause loading the DWARF data to fail entirely (issue
    19  	// #12592). Test that we can at least read the DWARF data.
    20  	d := elfData(t, "testdata/split.elf")
    21  	r := d.Reader()
    22  	e, err := r.Next()
    23  	if err != nil {
    24  		t.Fatal(err)
    25  	}
    26  	if e.Tag != TagCompileUnit {
    27  		t.Fatalf("bad tag: have %s, want %s", e.Tag, TagCompileUnit)
    28  	}
    29  	// Check that we were able to parse the unknown section offset
    30  	// field, even if we can't figure out its DWARF class.
    31  	const AttrGNUAddrBase Attr = 0x2133
    32  	f := e.AttrField(AttrGNUAddrBase)
    33  	if _, ok := f.Val.(int64); !ok {
    34  		t.Fatalf("bad attribute value type: have %T, want int64", f.Val)
    35  	}
    36  	if f.Class != ClassUnknown {
    37  		t.Fatalf("bad class: have %s, want %s", f.Class, ClassUnknown)
    38  	}
    39  }
    40  
    41  // wantRange maps from a PC to the ranges of the compilation unit
    42  // containing that PC.
    43  type wantRange struct {
    44  	pc     uint64
    45  	ranges [][2]uint64
    46  }
    47  
    48  func TestReaderSeek(t *testing.T) {
    49  	want := []wantRange{
    50  		{0x40059d, [][2]uint64{{0x40059d, 0x400601}}},
    51  		{0x400600, [][2]uint64{{0x40059d, 0x400601}}},
    52  		{0x400601, [][2]uint64{{0x400601, 0x400611}}},
    53  		{0x4005f0, [][2]uint64{{0x40059d, 0x400601}}}, // loop test
    54  		{0x10, nil},
    55  		{0x400611, nil},
    56  	}
    57  	testRanges(t, "testdata/line-gcc.elf", want)
    58  
    59  	want = []wantRange{
    60  		{0x401122, [][2]uint64{{0x401122, 0x401166}}},
    61  		{0x401165, [][2]uint64{{0x401122, 0x401166}}},
    62  		{0x401166, [][2]uint64{{0x401166, 0x401179}}},
    63  	}
    64  	testRanges(t, "testdata/line-gcc-dwarf5.elf", want)
    65  
    66  	want = []wantRange{
    67  		{0x401130, [][2]uint64{{0x401130, 0x40117e}}},
    68  		{0x40117d, [][2]uint64{{0x401130, 0x40117e}}},
    69  		{0x40117e, nil},
    70  	}
    71  	testRanges(t, "testdata/line-clang-dwarf5.elf", want)
    72  
    73  	want = []wantRange{
    74  		{0x401126, [][2]uint64{{0x401126, 0x40116a}}},
    75  		{0x40116a, [][2]uint64{{0x40116a, 0x401180}}},
    76  	}
    77  	testRanges(t, "testdata/line-gcc-zstd.elf", want)
    78  }
    79  
    80  func TestRangesSection(t *testing.T) {
    81  	want := []wantRange{
    82  		{0x400500, [][2]uint64{{0x400500, 0x400549}, {0x400400, 0x400408}}},
    83  		{0x400400, [][2]uint64{{0x400500, 0x400549}, {0x400400, 0x400408}}},
    84  		{0x400548, [][2]uint64{{0x400500, 0x400549}, {0x400400, 0x400408}}},
    85  		{0x400407, [][2]uint64{{0x400500, 0x400549}, {0x400400, 0x400408}}},
    86  		{0x400408, nil},
    87  		{0x400449, nil},
    88  		{0x4003ff, nil},
    89  	}
    90  	testRanges(t, "testdata/ranges.elf", want)
    91  }
    92  
    93  func TestRangesRnglistx(t *testing.T) {
    94  	want := []wantRange{
    95  		{0x401000, [][2]uint64{{0x401020, 0x40102c}, {0x401000, 0x40101d}}},
    96  		{0x40101c, [][2]uint64{{0x401020, 0x40102c}, {0x401000, 0x40101d}}},
    97  		{0x40101d, nil},
    98  		{0x40101f, nil},
    99  		{0x401020, [][2]uint64{{0x401020, 0x40102c}, {0x401000, 0x40101d}}},
   100  		{0x40102b, [][2]uint64{{0x401020, 0x40102c}, {0x401000, 0x40101d}}},
   101  		{0x40102c, nil},
   102  	}
   103  	testRanges(t, "testdata/rnglistx.elf", want)
   104  }
   105  
   106  func testRanges(t *testing.T, name string, want []wantRange) {
   107  	d := elfData(t, name)
   108  	r := d.Reader()
   109  	for _, w := range want {
   110  		entry, err := r.SeekPC(w.pc)
   111  		if err != nil {
   112  			if w.ranges != nil {
   113  				t.Errorf("%s: missing Entry for %#x", name, w.pc)
   114  			}
   115  			if err != ErrUnknownPC {
   116  				t.Errorf("%s: expected ErrUnknownPC for %#x, got %v", name, w.pc, err)
   117  			}
   118  			continue
   119  		}
   120  
   121  		ranges, err := d.Ranges(entry)
   122  		if err != nil {
   123  			t.Errorf("%s: %v", name, err)
   124  			continue
   125  		}
   126  		if !reflect.DeepEqual(ranges, w.ranges) {
   127  			t.Errorf("%s: for %#x got %x, expected %x", name, w.pc, ranges, w.ranges)
   128  		}
   129  	}
   130  }
   131  
   132  func TestReaderRanges(t *testing.T) {
   133  	type subprograms []struct {
   134  		name   string
   135  		ranges [][2]uint64
   136  	}
   137  	tests := []struct {
   138  		filename    string
   139  		subprograms subprograms
   140  	}{
   141  		{
   142  			"testdata/line-gcc.elf",
   143  			subprograms{
   144  				{"f1", [][2]uint64{{0x40059d, 0x4005e7}}},
   145  				{"main", [][2]uint64{{0x4005e7, 0x400601}}},
   146  				{"f2", [][2]uint64{{0x400601, 0x400611}}},
   147  			},
   148  		},
   149  		{
   150  			"testdata/line-gcc-dwarf5.elf",
   151  			subprograms{
   152  				{"main", [][2]uint64{{0x401147, 0x401166}}},
   153  				{"f1", [][2]uint64{{0x401122, 0x401147}}},
   154  				{"f2", [][2]uint64{{0x401166, 0x401179}}},
   155  			},
   156  		},
   157  		{
   158  			"testdata/line-clang-dwarf5.elf",
   159  			subprograms{
   160  				{"main", [][2]uint64{{0x401130, 0x401144}}},
   161  				{"f1", [][2]uint64{{0x401150, 0x40117e}}},
   162  				{"f2", [][2]uint64{{0x401180, 0x401197}}},
   163  			},
   164  		},
   165  		{
   166  			"testdata/line-gcc-zstd.elf",
   167  			subprograms{
   168  				{"f2", nil},
   169  				{"main", [][2]uint64{{0x40114b, 0x40116a}}},
   170  				{"f1", [][2]uint64{{0x401126, 0x40114b}}},
   171  				{"f2", [][2]uint64{{0x40116a, 0x401180}}},
   172  			},
   173  		},
   174  	}
   175  
   176  	for _, test := range tests {
   177  		d := elfData(t, test.filename)
   178  		subprograms := test.subprograms
   179  
   180  		r := d.Reader()
   181  		i := 0
   182  		for entry, err := r.Next(); entry != nil && err == nil; entry, err = r.Next() {
   183  			if entry.Tag != TagSubprogram {
   184  				continue
   185  			}
   186  
   187  			if i > len(subprograms) {
   188  				t.Fatalf("%s: too many subprograms (expected at most %d)", test.filename, i)
   189  			}
   190  
   191  			if got := entry.Val(AttrName).(string); got != subprograms[i].name {
   192  				t.Errorf("%s: subprogram %d name is %s, expected %s", test.filename, i, got, subprograms[i].name)
   193  			}
   194  			ranges, err := d.Ranges(entry)
   195  			if err != nil {
   196  				t.Errorf("%s: subprogram %d: %v", test.filename, i, err)
   197  				continue
   198  			}
   199  			if !reflect.DeepEqual(ranges, subprograms[i].ranges) {
   200  				t.Errorf("%s: subprogram %d ranges are %x, expected %x", test.filename, i, ranges, subprograms[i].ranges)
   201  			}
   202  			i++
   203  		}
   204  
   205  		if i < len(subprograms) {
   206  			t.Errorf("%s: saw only %d subprograms, expected %d", test.filename, i, len(subprograms))
   207  		}
   208  	}
   209  }
   210  
   211  func Test64Bit(t *testing.T) {
   212  	// I don't know how to generate a 64-bit DWARF debug
   213  	// compilation unit except by using XCOFF, so this is
   214  	// hand-written.
   215  	tests := []struct {
   216  		name      string
   217  		info      []byte
   218  		addrSize  int
   219  		byteOrder binary.ByteOrder
   220  	}{
   221  		{
   222  			"32-bit little",
   223  			[]byte{0x30, 0, 0, 0, // comp unit length
   224  				4, 0, // DWARF version 4
   225  				0, 0, 0, 0, // abbrev offset
   226  				8, // address size
   227  				0,
   228  				0, 0, 0, 0, 0, 0, 0, 0,
   229  				0, 0, 0, 0, 0, 0, 0, 0,
   230  				0, 0, 0, 0, 0, 0, 0, 0,
   231  				0, 0, 0, 0, 0, 0, 0, 0,
   232  				0, 0, 0, 0, 0, 0, 0, 0,
   233  			},
   234  			8, binary.LittleEndian,
   235  		},
   236  		{
   237  			"64-bit little",
   238  			[]byte{0xff, 0xff, 0xff, 0xff, // 64-bit DWARF
   239  				0x30, 0, 0, 0, 0, 0, 0, 0, // comp unit length
   240  				4, 0, // DWARF version 4
   241  				0, 0, 0, 0, 0, 0, 0, 0, // abbrev offset
   242  				8, // address size
   243  				0, 0, 0, 0, 0,
   244  				0, 0, 0, 0, 0, 0, 0, 0,
   245  				0, 0, 0, 0, 0, 0, 0, 0,
   246  				0, 0, 0, 0, 0, 0, 0, 0,
   247  				0, 0, 0, 0, 0, 0, 0, 0,
   248  			},
   249  			8, binary.LittleEndian,
   250  		},
   251  		{
   252  			"64-bit big",
   253  			[]byte{0xff, 0xff, 0xff, 0xff, // 64-bit DWARF
   254  				0, 0, 0, 0, 0, 0, 0, 0x30, // comp unit length
   255  				0, 4, // DWARF version 4
   256  				0, 0, 0, 0, 0, 0, 0, 0, // abbrev offset
   257  				8, // address size
   258  				0, 0, 0, 0, 0,
   259  				0, 0, 0, 0, 0, 0, 0, 0,
   260  				0, 0, 0, 0, 0, 0, 0, 0,
   261  				0, 0, 0, 0, 0, 0, 0, 0,
   262  				0, 0, 0, 0, 0, 0, 0, 0,
   263  			},
   264  			8, binary.BigEndian,
   265  		},
   266  	}
   267  
   268  	for _, test := range tests {
   269  		data, err := New(nil, nil, nil, test.info, nil, nil, nil, nil)
   270  		if err != nil {
   271  			t.Errorf("%s: %v", test.name, err)
   272  		}
   273  
   274  		r := data.Reader()
   275  		if r.AddressSize() != test.addrSize {
   276  			t.Errorf("%s: got address size %d, want %d", test.name, r.AddressSize(), test.addrSize)
   277  		}
   278  		if r.ByteOrder() != test.byteOrder {
   279  			t.Errorf("%s: got byte order %s, want %s", test.name, r.ByteOrder(), test.byteOrder)
   280  		}
   281  	}
   282  }
   283  
   284  func TestUnitIteration(t *testing.T) {
   285  	// Iterate over all ELF test files we have and ensure that
   286  	// we get the same set of compilation units skipping (method 0)
   287  	// and not skipping (method 1) CU children.
   288  	files, err := filepath.Glob(filepath.Join("testdata", "*.elf"))
   289  	if err != nil {
   290  		t.Fatal(err)
   291  	}
   292  	for _, file := range files {
   293  		t.Run(file, func(t *testing.T) {
   294  			d := elfData(t, file)
   295  			var units [2][]any
   296  			for method := range units {
   297  				for r := d.Reader(); ; {
   298  					ent, err := r.Next()
   299  					if err != nil {
   300  						t.Fatal(err)
   301  					}
   302  					if ent == nil {
   303  						break
   304  					}
   305  					if ent.Tag == TagCompileUnit {
   306  						units[method] = append(units[method], ent.Val(AttrName))
   307  					}
   308  					if method == 0 {
   309  						if ent.Tag != TagCompileUnit {
   310  							t.Fatalf("found unexpected tag %v on top level", ent.Tag)
   311  						}
   312  						r.SkipChildren()
   313  					}
   314  				}
   315  			}
   316  			t.Logf("skipping CUs:     %v", units[0])
   317  			t.Logf("not-skipping CUs: %v", units[1])
   318  			if !reflect.DeepEqual(units[0], units[1]) {
   319  				t.Fatal("set of CUs differ")
   320  			}
   321  		})
   322  	}
   323  }
   324  
   325  func TestIssue51758(t *testing.T) {
   326  	abbrev := []byte{0x21, 0xff,
   327  		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c,
   328  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c,
   329  		0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33,
   330  		0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37,
   331  		0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37,
   332  		0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c,
   333  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c,
   334  		0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33,
   335  		0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37,
   336  		0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37,
   337  		0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c,
   338  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c,
   339  		0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33,
   340  		0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37,
   341  		0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37,
   342  		0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c,
   343  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c,
   344  		0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x22, 0x5c,
   345  		0x6e, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20,
   346  		0x5c, 0x22, 0x5c, 0x5c, 0x30, 0x30, 0x35, 0x5c, 0x5c, 0x30, 0x30,
   347  		0x30, 0x5c, 0x5c, 0x30, 0x30, 0x30, 0x5c, 0x5c, 0x30, 0x30, 0x30,
   348  		0x5c, 0x5c, 0x30, 0x30, 0x34, 0x5c, 0x5c, 0x30, 0x30, 0x30, 0x5c,
   349  		0x5c, 0x30, 0x30, 0x30, 0x2d, 0x5c, 0x5c, 0x30, 0x30, 0x30, 0x5c,
   350  		0x22, 0x5c, 0x6e, 0x20, 0x20, 0x7d, 0x5c, 0x6e, 0x7d, 0x5c, 0x6e,
   351  		0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65,
   352  		0x3a, 0x20, 0x22, 0x21, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37,
   353  		0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33,
   354  		0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c,
   355  		0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37,
   356  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37,
   357  		0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33,
   358  		0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c,
   359  		0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37,
   360  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37,
   361  		0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33,
   362  		0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c,
   363  		0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37,
   364  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37,
   365  		0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33,
   366  		0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c,
   367  		0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37,
   368  		0x5c, 0x33, 0x37, 0x37, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
   369  		0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x22, 0x5c, 0x30, 0x30, 0x35, 0x5c,
   370  		0x30, 0x30, 0x30, 0x5c, 0x30, 0x30, 0x30, 0x5c, 0x30, 0x30, 0x30,
   371  		0x5c, 0x30, 0x30, 0x34, 0x5c, 0x30, 0x30, 0x30, 0x5c, 0x30, 0x30,
   372  		0x30, 0x2d, 0x5c, 0x30, 0x30, 0x30, 0x22, 0x0a, 0x20, 0x20, 0x7d,
   373  		0x0a, 0x7d, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x7b, 0x0a, 0x7d,
   374  		0x0a, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x7b, 0x0a, 0x7d, 0x0a, 0x6c,
   375  		0x69, 0x73, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x4e, 0x65, 0x77,
   376  		0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x62, 0x62, 0x72,
   377  		0x65, 0x76, 0x3a, 0x20, 0x22, 0x5c, 0x30, 0x30, 0x35, 0x5c, 0x30,
   378  		0x30, 0x30, 0x5c, 0x30, 0x30, 0x30, 0x5c, 0x30, 0x30, 0x30, 0x5c,
   379  		0x30, 0x30, 0x34, 0x5c, 0x30, 0x30, 0x30, 0x5c, 0x30, 0x30, 0x30,
   380  		0x2d, 0x5c, 0x30, 0x30, 0x30, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x7b,
   381  		0x5c, 0x6e, 0x20, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x7b, 0x5c, 0x6e,
   382  		0x20, 0x20, 0x20, 0x20, 0x61, 0x62, 0x62, 0x72, 0x65, 0x76, 0x3a,
   383  		0x20, 0x5c, 0x22, 0x21, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c,
   384  		0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33,
   385  		0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37,
   386  		0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37,
   387  		0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c,
   388  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c,
   389  		0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33,
   390  		0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37,
   391  		0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37,
   392  		0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c,
   393  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c,
   394  		0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33,
   395  		0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37,
   396  		0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37,
   397  		0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c,
   398  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c,
   399  		0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33,
   400  		0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37,
   401  		0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37,
   402  		0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x5c, 0x33, 0x37, 0x37, 0x5c,
   403  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x22, 0x5c, 0x6e, 0x20, 0x20, 0x20,
   404  		0x20, 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x5c, 0x22, 0x5c, 0x5c,
   405  		0x30, 0x30, 0x35, 0x5c, 0x5c, 0x30, 0x30, 0x30, 0x5c, 0x5c, 0x30,
   406  		0x30, 0x30, 0x5c, 0x5c, 0x30, 0x30, 0x30, 0x5c, 0x5c, 0x30, 0x30,
   407  		0x34, 0x5c, 0x5c, 0x30, 0x30, 0x30, 0x5c, 0x5c, 0x30, 0x30, 0x30,
   408  		0x2d, 0x5c, 0x5c, 0x30, 0x30, 0x30, 0x5c, 0x22, 0x5c, 0x6e, 0x20,
   409  		0x20, 0x7d, 0x5c, 0x6e, 0x7d, 0x5c, 0x6e, 0x22, 0x0a, 0x20, 0x20,
   410  		0x20, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x22, 0x21,
   411  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37,
   412  		0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33,
   413  		0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c,
   414  		0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37,
   415  		0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37,
   416  		0x37, 0x5c, 0x33, 0x37, 0x37, 0x5c, 0x33, 0x37, 0x37, 0xff, 0xff,
   417  		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   418  		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   419  		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   420  		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   421  		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
   422  		0xff}
   423  	aranges := []byte{0x2c}
   424  	frame := []byte{}
   425  	info := []byte{0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x2d, 0x0, 0x5,
   426  		0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x2d, 0x0}
   427  
   428  	// The input above is malformed; the goal here it just to make sure
   429  	// that we don't get a panic or other bad behavior while trying to
   430  	// construct a dwarf.Data object from the input.  For good measure,
   431  	// test to make sure we can handle the case where the input is
   432  	// truncated as well.
   433  	for i := 0; i <= len(info); i++ {
   434  		truncated := info[:i]
   435  		dw, err := New(abbrev, aranges, frame, truncated, nil, nil, nil, nil)
   436  		if err == nil {
   437  			t.Errorf("expected error")
   438  		} else {
   439  			if dw != nil {
   440  				t.Errorf("got non-nil dw, wanted nil")
   441  			}
   442  		}
   443  	}
   444  }
   445  
   446  func TestIssue52045(t *testing.T) {
   447  	var abbrev, aranges, frame, line, pubnames, ranges, str []byte
   448  	info := []byte{0x7, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
   449  
   450  	// A hand-crafted input corresponding to a minimal-size
   451  	// .debug_info (header only, no DIEs) and an empty abbrev table.
   452  	data0, _ := New(abbrev, aranges, frame, info, line, pubnames, ranges, str)
   453  	reader0 := data0.Reader()
   454  	entry0, _ := reader0.SeekPC(0x0)
   455  	// main goal is to make sure we can get here without crashing
   456  	if entry0 != nil {
   457  		t.Errorf("got non-nil entry0, wanted nil")
   458  	}
   459  }