]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: debug code to panic when marking a free object
authorAustin Clements <austin@google.com>
Mon, 3 Oct 2016 20:18:17 +0000 (16:18 -0400)
committerAustin Clements <austin@google.com>
Wed, 26 Oct 2016 15:46:00 +0000 (15:46 +0000)
This adds debug code enabled in gccheckmark mode that panics if we
attempt to mark an unallocated object. This is a common issue with the
hybrid barrier when we're manipulating uninitialized memory that
contains stale pointers. This also tends to catch bugs that will lead
to "sweep increased allocation count" crashes closer to the source of
the bug.

Change-Id: I443ead3eac6f316a46f50b106078b524cac317f4
Reviewed-on: https://go-review.googlesource.com/31761
Reviewed-by: Rick Hudson <rlh@golang.org>
src/runtime/mgcmark.go

index e47072d88cd962fd6810c236abf2424bf0e4378a..e62e470217055b2ef37e0593ed4e8bade023ac8b 100644 (file)
@@ -1294,6 +1294,13 @@ func greyobject(obj, base, off uintptr, hbits heapBits, span *mspan, gcw *gcWork
                        throw("setCheckmarked and isCheckmarked disagree")
                }
        } else {
+               if debug.gccheckmark > 0 && span.isFree(objIndex) {
+                       print("runtime: marking free object ", hex(obj), " found at *(", hex(base), "+", hex(off), ")\n")
+                       gcDumpObject("base", base, off)
+                       gcDumpObject("obj", obj, ^uintptr(0))
+                       throw("marking free object")
+               }
+
                // If marked we have nothing to do.
                if mbits.isMarked() {
                        return