aboutsummaryrefslogtreecommitdiff
path: root/test/unsafebuiltins.go
diff options
context:
space:
mode:
authorcuiweixie <cuiweixie@gmail.com>2022-08-16 17:52:13 +0800
committerMatthew Dempsky <mdempsky@google.com>2022-08-31 17:15:15 +0000
commitc7085329367e14f0aa828a3793cf66d9f82f05c2 (patch)
tree94f2e9ae0cfc74e1b3cd477480f718a2bd4b6814 /test/unsafebuiltins.go
parent301ca7513f427f6511fb67cc0385151403cd1729 (diff)
downloadgo-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.go38
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) {