Avoid segfault when ticky file argument is stderr
authorTim Chevalier <chevalier@alum.wellesley.edu>
Thu, 26 Apr 2007 19:18:57 +0000 (19:18 +0000)
committerTim Chevalier <chevalier@alum.wellesley.edu>
Thu, 26 Apr 2007 19:18:57 +0000 (19:18 +0000)
If you compiled a program with -ticky and ran it with:
./foo +RTS -rstderr -RTS
the result would be a segfault. This was because the RTS interprets stderr to
mean "use debugBelch to print out messages," and sets the ticky file pointer
to NULL as a result, but PrintTickyInfo (the function in Ticky.c that prints
out the ticky report) wasn't checking for NULL.

I changed PrintTickyInfo to check whether the ticky file pointer is NULL and
output to stderr if so.

Also removed an unused import from CodeOutput.lhs.

compiler/main/CodeOutput.lhs
rts/Ticky.c

index 61b10bc..0e52077 100644 (file)
@@ -30,8 +30,6 @@ import Cmm            ( Cmm )
 import HscTypes
 import DynFlags
 
-import StaticFlags      ( opt_DoTickyProfiling )
-
 import ErrUtils                ( dumpIfSet_dyn, showPass, ghcExit )
 import Outputable
 import Pretty          ( Mode(..), printDoc )
index 8901331..2cd3740 100644 (file)
@@ -110,6 +110,14 @@ PrintTickyInfo(void)
 
   FILE *tf = RtsFlags.TickyFlags.tickyFile;
 
+  /* If tf = NULL, that means the user passed in stderr for the ticky stats
+     file. According to a comment in RtsFlags.c, this means to use 
+     debugBelch to print out messages. But this function prints out a lot
+     of stuff so in order to avoid changing a lot of code, we just dump
+     the same output to stderr (for now). */
+  if( tf == NULL )
+    tf = stderr;
+
   /* krc: avoid dealing with this just now */
 #if FALSE
   fprintf(tf,"\n\nALLOCATIONS: %ld (%ld words total: %ld admin, %ld goods, %ld slop)\n",