Add new debug flag -DZ
authorTobias Guggenmos <tguggenm@redhat.com>
Sat, 7 Sep 2019 13:32:06 +0000 (15:32 +0200)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Thu, 3 Oct 2019 16:17:33 +0000 (12:17 -0400)
Zeros heap memory after gc freed it.

docs/users_guide/runtime_control.rst
includes/rts/Flags.h
rts/Linker.c
rts/RtsFlags.c
rts/RtsUtils.c
rts/Trace.h
rts/sm/BlockAlloc.c
rts/sm/Storage.c
testsuite/tests/rts/all.T
testsuite/tests/rts/test-zeroongc.hs [new file with mode: 0644]
testsuite/tests/rts/test-zeroongc.stdout [new file with mode: 0644]

index 77b86e3..32d665d 100644 (file)
@@ -1161,6 +1161,7 @@ recommended for everyday use!
 .. rts-flag::  -Dg  DEBUG: gc
 .. rts-flag::  -Db  DEBUG: block
 .. rts-flag::  -DS  DEBUG: sanity
+.. rts-flag::  -DZ  DEBUG: zero freed memory on GC
 .. rts-flag::  -Dt  DEBUG: stable
 .. rts-flag::  -Dp  DEBUG: prof
 .. rts-flag::  -Da  DEBUG: apply
index 41fcf08..b3caf13 100644 (file)
@@ -97,6 +97,7 @@ typedef struct _DEBUG_FLAGS {
     bool gc;             /* 'g' */
     bool block_alloc;    /* 'b' */
     bool sanity;         /* 'S'   warning: might be expensive! */
+    bool zero_on_gc;     /* 'Z' */
     bool stable;         /* 't' */
     bool prof;           /* 'p' */
     bool linker;         /* 'l'   the object linker */
index 54e5049..1f3d816 100644 (file)
@@ -1185,7 +1185,7 @@ void freeObjectCode (ObjectCode *oc)
                            oc->sections[i].mapped_size);
                     break;
                 case SECTION_M32:
-                    IF_DEBUG(sanity,
+                    IF_DEBUG(zero_on_gc,
                         memset(oc->sections[i].start,
                             0x00, oc->sections[i].size));
                     m32_free(oc->sections[i].start,
@@ -1193,7 +1193,7 @@ void freeObjectCode (ObjectCode *oc)
                     break;
 #endif
                 case SECTION_MALLOC:
-                    IF_DEBUG(sanity,
+                    IF_DEBUG(zero_on_gc,
                         memset(oc->sections[i].start,
                             0x00, oc->sections[i].size));
                     stgFree(oc->sections[i].start);
index cbc9a33..d4301c4 100644 (file)
@@ -181,6 +181,7 @@ void initRtsFlagsDefaults(void)
     RtsFlags.DebugFlags.gc              = false;
     RtsFlags.DebugFlags.block_alloc     = false;
     RtsFlags.DebugFlags.sanity          = false;
+    RtsFlags.DebugFlags.zero_on_gc      = false;
     RtsFlags.DebugFlags.stable          = false;
     RtsFlags.DebugFlags.stm             = false;
     RtsFlags.DebugFlags.prof            = false;
@@ -405,6 +406,7 @@ usage_text[] = {
 "  -Dg  DEBUG: gc",
 "  -Db  DEBUG: block",
 "  -DS  DEBUG: sanity",
+"  -DZ  DEBUG: zero freed memory during GC",
 "  -Dt  DEBUG: stable",
 "  -Dp  DEBUG: prof",
 "  -Da  DEBUG: apply",
@@ -1861,6 +1863,9 @@ static void read_debug_flags(const char* arg)
         case 'S':
             RtsFlags.DebugFlags.sanity = true;
             break;
+        case 'Z':
+            RtsFlags.DebugFlags.zero_on_gc = true;
+            break;
         case 't':
             RtsFlags.DebugFlags.stable = true;
             break;
@@ -1895,6 +1900,12 @@ static void read_debug_flags(const char* arg)
     // -Dx also turns on -v.  Use -l to direct trace
     // events to the .eventlog file instead.
     RtsFlags.TraceFlags.tracing = TRACE_STDERR;
+
+   // sanity implies zero_on_gc
+   if(RtsFlags.DebugFlags.sanity){
+        RtsFlags.DebugFlags.zero_on_gc = true;
+   }
+
 }
 #endif
 
index 2a53d18..b9ddb2a 100644 (file)
@@ -79,7 +79,7 @@ stgMallocBytes (size_t n, char *msg)
       rtsConfig.mallocFailHook((W_) n, msg);
       stg_exit(EXIT_INTERNAL_ERROR);
     }
-    IF_DEBUG(sanity, memset(space, 0xbb, n));
+    IF_DEBUG(zero_on_gc, memset(space, 0xbb, n));
     return space;
 }
 
index 9985adc..d3bb226 100644 (file)
@@ -52,6 +52,7 @@ enum CapsetType { CapsetTypeCustom = CAPSET_TYPE_CUSTOM,
 #define DEBUG_gc          RtsFlags.DebugFlags.gc
 #define DEBUG_block_alloc RtsFlags.DebugFlags.alloc
 #define DEBUG_sanity      RtsFlags.DebugFlags.sanity
+#define DEBUG_zero_on_gc  RtsFlags.DebugFlags.zero_on_gc
 #define DEBUG_stable      RtsFlags.DebugFlags.stable
 #define DEBUG_stm         RtsFlags.DebugFlags.stm
 #define DEBUG_prof        RtsFlags.DebugFlags.prof
index bbb4f8a..f9e3d11 100644 (file)
@@ -456,7 +456,7 @@ allocGroupOnNode (uint32_t node, W_ n)
     }
 
 finish:
-    IF_DEBUG(sanity, memset(bd->start, 0xaa, bd->blocks * BLOCK_SIZE));
+    IF_DEBUG(zero_on_gc, memset(bd->start, 0xaa, bd->blocks * BLOCK_SIZE));
     IF_DEBUG(sanity, checkFreeListSanity());
     return bd;
 }
@@ -531,7 +531,7 @@ bdescr* allocLargeChunkOnNode (uint32_t node, W_ min, W_ max)
 
     recordAllocatedBlocks(node, bd->blocks);
 
-    IF_DEBUG(sanity, memset(bd->start, 0xaa, bd->blocks * BLOCK_SIZE));
+    IF_DEBUG(zero_on_gc, memset(bd->start, 0xaa, bd->blocks * BLOCK_SIZE));
     IF_DEBUG(sanity, checkFreeListSanity());
     return bd;
 }
@@ -656,7 +656,7 @@ freeGroup(bdescr *p)
   p->gen = NULL;
   p->gen_no = 0;
   /* fill the block group with garbage if sanity checking is on */
-  IF_DEBUG(sanity,memset(p->start, 0xaa, (W_)p->blocks * BLOCK_SIZE));
+  IF_DEBUG(zero_on_gc, memset(p->start, 0xaa, (W_)p->blocks * BLOCK_SIZE));
 
   if (p->blocks == 0) barf("freeGroup: block size is zero");
 
index 3f91905..d4be531 100644 (file)
@@ -650,7 +650,7 @@ resetNurseries (void)
             ASSERT(bd->gen_no == 0);
             ASSERT(bd->gen == g0);
             ASSERT(bd->node == capNoToNumaNode(n));
-            IF_DEBUG(sanity, memset(bd->start, 0xaa, BLOCK_SIZE));
+            IF_DEBUG(zero_on_gc, memset(bd->start, 0xaa, BLOCK_SIZE));
         }
     }
 #endif
index 9f2c064..ba5b139 100644 (file)
@@ -392,3 +392,4 @@ test('keep-cafs',
   makefile_test, ['KeepCafs'])
 
 test('T16514', unless(opsys('mingw32'), skip), compile_and_run, ['T16514_c.cpp -lstdc++'])
+test('test-zeroongc', extra_run_opts('-DZ'), compile_and_run, ['-debug'])
diff --git a/testsuite/tests/rts/test-zeroongc.hs b/testsuite/tests/rts/test-zeroongc.hs
new file mode 100644 (file)
index 0000000..73566f6
--- /dev/null
@@ -0,0 +1 @@
+main = putStrLn "Hello World"
diff --git a/testsuite/tests/rts/test-zeroongc.stdout b/testsuite/tests/rts/test-zeroongc.stdout
new file mode 100644 (file)
index 0000000..557db03
--- /dev/null
@@ -0,0 +1 @@
+Hello World