Hello. As I finally hunted issue in Firefox that was responsible for start-up segfault, I would like to describe a new behavior of the compiler that emits clobbers to class constructors (w/ -flifetime-dse). As also Richi spotted quite similar issue in openjade package, I think it worth for mentioning in porting:
Ok? Thanks, Martin
Index: htdocs/gcc-6/porting_to.html =================================================================== RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-6/porting_to.html,v retrieving revision 1.14 diff --unified -r1.14 porting_to.html --- htdocs/gcc-6/porting_to.html 14 Feb 2016 13:13:43 -0000 1.14 +++ htdocs/gcc-6/porting_to.html 16 Feb 2016 14:41:10 -0000 @@ -316,7 +316,7 @@ </code></pre> <p> -Finally, the type and mangling of flexible array members has changed +Furthermore, the type and mangling of flexible array members has changed from previous releases. While in GCC 5 and prior the type of a flexible array member is an array of zero elements (a GCC extension), in GCC 6 it is that of an array of an unspecified bound (i.e., <tt>T[]</tt> as opposed @@ -324,6 +324,50 @@ <tt>-fabi-version</tt> or <tt>-Wabi</tt> option to disable or warn about. </p> +<p> +Finally, the C++ compiler (with enabled <code>-flifetime-dse</code>) +has been more aggressive in dead-store elimination in situations where +a memory store to a location precedes a constructor to the +memory location. Described situation can be commonly found in programs +which zero a memory that is eventually passed to a placement new operator: + +<pre><code> +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +struct A +{ + A () {} + void *operator new (size_t s) + { + void *ptr = malloc (s); + memset (ptr, 0, s); + return ptr; + } + + int value; +}; + +A * +__attribute__ ((noinline)) +build (void) +{ + return new A (); +} + +int main() +{ + A *a = build (); + assert (a->value == 0); /* Use of uninitialized value */ + free (a); +} +</code></pre> + +If the program cannot be fixed to remove the undefined behavior then +the option <code>-fno-lifetime-dse</code> can be used to disable +this optimization. + <h2>-Wmisleading-indentation</h2> <p> A new warning <code>-Wmisleading-indentation</code> was added