]> Cypherpunks.ru repositories - gostls13.git/blobdiff - test/unsafebuiltins.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / unsafebuiltins.go
index c10f8084a753f9af34ef371cb92eb272b1ac4b18..8ee72ec2e8abdfab43dd489a4c41582cb71149ca 100644 (file)
@@ -30,8 +30,11 @@ func main() {
                assert(len(s) == len(p))
                assert(cap(s) == len(p))
 
-               // nil pointer
-               mustPanic(func() { _ = unsafe.Slice((*int)(nil), 0) })
+               // nil pointer with zero length returns nil
+               assert(unsafe.Slice((*int)(nil), 0) == nil)
+
+               // nil pointer with positive length panics
+               mustPanic(func() { _ = unsafe.Slice((*int)(nil), 1) })
 
                // negative length
                var neg int = -1
@@ -44,6 +47,49 @@ func main() {
                // size overflows address space
                mustPanic(func() { _ = unsafe.Slice(new(uint64), maxUintptr/8) })
                mustPanic(func() { _ = unsafe.Slice(new(uint64), maxUintptr/8+1) })
+
+               // sliced memory overflows address space
+               last := (*byte)(unsafe.Pointer(^uintptr(0)))
+               _ = 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))
        }
 }