]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: revise TestSetPanicOnFault
authorRuss Cox <rsc@golang.org>
Fri, 19 Sep 2014 01:43:09 +0000 (21:43 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 19 Sep 2014 01:43:09 +0000 (21:43 -0400)
We can't assume all those addresses are unmapped.
But at least one should be.

What we're really testing is that the program doesn't crash.

Fixes #8542.

LGTM=iant
R=golang-codereviews, iant, minux
CC=golang-codereviews
https://golang.org/cl/144120043

src/runtime/runtime_test.go

index cffc9f7d35828d30d26371d1e6fa3685954aba8c..3c4075842b594dae000ddac8e496e5b5d82eb0ae 100644 (file)
@@ -157,8 +157,8 @@ var faultAddrs = []uint64{
        // or else malformed.
        0xffffffffffffffff,
        0xfffffffffffff001,
-       // no 0xffffffffffff0001; 0xffff0001 is mapped for 32-bit user space on OS X
-       // no 0xfffffffffff00001; 0xfff00001 is mapped for 32-bit user space sometimes on Linux
+       0xffffffffffff0001,
+       0xfffffffffff00001,
        0xffffffffff000001,
        0xfffffffff0000001,
        0xffffffff00000001,
@@ -182,26 +182,33 @@ func TestSetPanicOnFault(t *testing.T) {
        old := debug.SetPanicOnFault(true)
        defer debug.SetPanicOnFault(old)
 
+       nfault := 0
        for _, addr := range faultAddrs {
-               testSetPanicOnFault(t, uintptr(addr))
+               testSetPanicOnFault(t, uintptr(addr), &nfault)
+       }
+       if nfault == 0 {
+               t.Fatalf("none of the addresses faulted")
        }
 }
 
-func testSetPanicOnFault(t *testing.T, addr uintptr) {
+func testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {
        if GOOS == "nacl" {
                t.Skip("nacl doesn't seem to fault on high addresses")
        }
 
        defer func() {
-               if err := recover(); err == nil {
-                       t.Fatalf("did not find error in recover")
+               if err := recover(); err != nil {
+                       *nfault++
                }
        }()
 
+       // The read should fault, except that sometimes we hit
+       // addresses that have had C or kernel pages mapped there
+       // readable by user code. So just log the content.
+       // If no addresses fault, we'll fail the test.
        var p *int
        p = (*int)(unsafe.Pointer(addr))
-       println(*p)
-       t.Fatalf("still here - should have faulted on address %#x", addr)
+       t.Logf("addr %#x: %#x\n", addr, *p)
 }
 
 func eqstring_generic(s1, s2 string) bool {