diff options
author | cuiweixie <cuiweixie@gmail.com> | 2022-08-16 17:52:13 +0800 |
---|---|---|
committer | Matthew Dempsky <mdempsky@google.com> | 2022-08-31 17:15:15 +0000 |
commit | c7085329367e14f0aa828a3793cf66d9f82f05c2 (patch) | |
tree | 94f2e9ae0cfc74e1b3cd477480f718a2bd4b6814 /test/unsafebuiltins.go | |
parent | 301ca7513f427f6511fb67cc0385151403cd1729 (diff) | |
download | go-c7085329367e14f0aa828a3793cf66d9f82f05c2.tar.gz go-c7085329367e14f0aa828a3793cf66d9f82f05c2.zip |
cmd/compile: add support for unsafe.{String,StringData,SliceData}
For #53003
Change-Id: I13a761daca8b433b271a1feb711c103d9820772d
Reviewed-on: https://go-review.googlesource.com/c/go/+/423774
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: hopehook <hopehook@golangcn.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'test/unsafebuiltins.go')
-rw-r--r-- | test/unsafebuiltins.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/test/unsafebuiltins.go b/test/unsafebuiltins.go index d04bcbdc7d..8ee72ec2e8 100644 --- a/test/unsafebuiltins.go +++ b/test/unsafebuiltins.go @@ -53,6 +53,44 @@ func main() { _ = unsafe.Slice(last, 1) mustPanic(func() { _ = unsafe.Slice(last, 2) }) } + + // unsafe.String + { + s := unsafe.String(&p[0], len(p)) + assert(s == string(p[:])) + assert(len(s) == len(p)) + + // the empty string + assert(unsafe.String(nil, 0) == "") + + // nil pointer with positive length panics + mustPanic(func() { _ = unsafe.String(nil, 1) }) + + // negative length + var neg int = -1 + mustPanic(func() { _ = unsafe.String(new(byte), neg) }) + + // length too large + var tooBig uint64 = math.MaxUint64 + mustPanic(func() { _ = unsafe.String(new(byte), tooBig) }) + + // string memory overflows address space + last := (*byte)(unsafe.Pointer(^uintptr(0))) + _ = unsafe.String(last, 1) + mustPanic(func() { _ = unsafe.String(last, 2) }) + } + + // unsafe.StringData + { + var s = "string" + assert(string(unsafe.Slice(unsafe.StringData(s), len(s))) == s) + } + + //unsafe.SliceData + { + var s = []byte("slice") + assert(unsafe.String(unsafe.SliceData(s), len(s)) == string(s)) + } } func assert(ok bool) { |