From: Leandro Lucarella Date: Thu, 9 Sep 2010 23:05:55 +0000 (-0300) Subject: Don't segfault if stats files can't be created X-Git-Url: https://git.llucax.com/software/dgc/cdgc.git/commitdiff_plain/9457e6cc1d1c824901af4fa8baca99f9b753b9cd?ds=sidebyside;hp=c216b75a02d7b09c6949be6ec102b5557a060c08 Don't segfault if stats files can't be created If any stats files (used by collect_stats_file and malloc_stats_file) can't be created, the program segfauls trying to use a null FILE*. It's extremely impolite to cause an strange segfault because of this, and since there is no sensible error reporting mechanism either, we just ignore those options if the selected files are not writable, as we do with unknown options or any other wrong option parameters. --- diff --git a/rt/gc/cdgc/stats.d b/rt/gc/cdgc/stats.d index 1a2e8ef..b854812 100644 --- a/rt/gc/cdgc/stats.d +++ b/rt/gc/cdgc/stats.d @@ -228,8 +228,8 @@ private: cstdio.FILE* start_file(char* filename, char* header) { cstdio.FILE* file = cstdio.fopen(filename, "w"); - assert (file !is null); - cstdio.fputs(header, file); + if (file !is null) + cstdio.fputs(header, file); return file; } @@ -298,22 +298,24 @@ public: Stats this_; this_.gc = gc; if (options.malloc_stats_file[0] != '\0') { - this_.active = true; this_.mallocs_file = this_.start_file( options.malloc_stats_file.ptr, "Timestamp,Time,Pointer,Size,Collection triggered," "Finalize,No scan,No move,Pointer map,Type size," "Pointer map scan bitmask (first word, hexa)," "Pointer map pointer bitmask (first word, hexa)\n"); + if (this_.mallocs_file !is null) + this_.active = true; } // collection if (options.collect_stats_file[0] != '\0') { - this_.active = true; this_.collections_file = this_.start_file( options.collect_stats_file.ptr, "Timestamp,Malloc time,Collection time,Stop-the-world time," "Used before,Free before,Wasted before,Overhead before," "Used after,Free after,Wasted after,Overhead after\n"); + if (this_.collections_file !is null) + this_.active = true; } this_.program_start = this_.now(); return this_;