diff options
Diffstat (limited to 'src/runtime')
| -rw-r--r-- | src/runtime/checkptr.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/runtime/checkptr.go b/src/runtime/checkptr.go new file mode 100644 index 0000000000..040a19a39c --- /dev/null +++ b/src/runtime/checkptr.go @@ -0,0 +1,50 @@ +// Copyright 2019 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 runtime + +import "unsafe" + +type ptrAlign struct { + ptr unsafe.Pointer + align uintptr +} + +func checkptrAlignment(p unsafe.Pointer, elem *_type) { + // TODO(mdempsky): What about fieldAlign? + if uintptr(p)&(uintptr(elem.align)-1) != 0 { + panic(ptrAlign{p, uintptr(elem.align)}) + } +} + +type ptrArith struct { + ptr unsafe.Pointer + originals []unsafe.Pointer +} + +func checkptrArithmetic(p unsafe.Pointer, originals []unsafe.Pointer) { + if 0 < uintptr(p) && uintptr(p) < minLegalPointer { + panic(ptrArith{p, originals}) + } + + base := checkptrBase(p) + if base == 0 { + return + } + + for _, original := range originals { + if base == checkptrBase(original) { + return + } + } + + panic(ptrArith{p, originals}) +} + +func checkptrBase(p unsafe.Pointer) uintptr { + base, _, _ := findObject(uintptr(p), 0, 0) + // TODO(mdempsky): If base == 0, then check if p points to the + // stack or a global variable. + return base +} |
