This file is indexed.

/usr/share/go-1.8/test/fixedbugs/issue16095.go is in golang-1.8-src 1.8.3-2ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
// run

// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"fmt"
	"runtime"
)

var sink *[20]byte

func f() (x [20]byte) {
	// Initialize x.
	for i := range x {
		x[i] = byte(i)
	}

	// Force x to be allocated on the heap.
	sink = &x
	sink = nil

	// Go to deferreturn after the panic below.
	defer func() {
		recover()
	}()

	// This call collects the heap-allocated version of x (oops!)
	runtime.GC()

	// Allocate that same object again and clobber it.
	y := new([20]byte)
	for i := 0; i < 20; i++ {
		y[i] = 99
	}
	// Make sure y is heap allocated.
	sink = y

	panic(nil)

	// After the recover we reach the deferreturn, which
	// copies the heap version of x back to the stack.
	// It gets the pointer to x from a stack slot that was
	// not marked as live during the call to runtime.GC().
}

var sinkint int

func g(p *int) (x [20]byte) {
	// Initialize x.
	for i := range x {
		x[i] = byte(i)
	}

	// Force x to be allocated on the heap.
	sink = &x
	sink = nil

	// Go to deferreturn after the panic below.
	defer func() {
		recover()
	}()

	// This call collects the heap-allocated version of x (oops!)
	runtime.GC()

	// Allocate that same object again and clobber it.
	y := new([20]byte)
	for i := 0; i < 20; i++ {
		y[i] = 99
	}
	// Make sure y is heap allocated.
	sink = y

	// panic with a non-call (with no fallthrough)
	for {
		sinkint = *p
	}

	// After the recover we reach the deferreturn, which
	// copies the heap version of x back to the stack.
	// It gets the pointer to x from a stack slot that was
	// not marked as live during the call to runtime.GC().
}

func main() {
	x := f()
	for i, v := range x {
		if v != byte(i) {
			fmt.Printf("%v\n", x)
			panic("bad f")
		}
	}
	x = g(nil)
	for i, v := range x {
		if v != byte(i) {
			fmt.Printf("%v\n", x)
			panic("bad g")
		}
	}
}