All released versions of GCC fail to reject definitions of constexpr variables initialized by dereferencing a null pointer, creating a dangling reference. The initialization is invalid and should be rejected. $ cat xx.cpp && /build/gcc-trunk-svn/gcc/xgcc -B /build/gcc-trunk-svn/gcc -S -Wall -Wextra -Wpedantic -o/dev/null xx.cpp constexpr int *p = 0; constexpr int &r = *p; static_assert (&r != 0, ""); xx.cpp:3:19: warning: the compiler can assume that the address of ‘r’ will never be NULL [-Waddress] static_assert (&r != 0, ""); ~~~^~~~ xx.cpp:3:1: error: static assertion failed static_assert (&r != 0, ""); ^~~~~~~~~~~~~
This is fixed by my patch for bug 60760 (to be resubmitted for 7.0).
Author: msebor Date: Sat Jul 30 22:36:56 2016 New Revision: 238909 URL: https://gcc.gnu.org/viewcvs?rev=238909&root=gcc&view=rev Log: PR c++/60760 - arithmetic on null pointers should not be allowed in constant PR c++/71091 - constexpr reference bound to a null pointer dereference gcc/cp/ChangeLog: PR c++/60760 PR c++/71091 * constexpr.c (cxx_eval_binary_expression): Reject invalid expressions involving null pointers. (cxx_eval_component_reference): Reject null pointer dereferences. (cxx_eval_indirect_ref): Reject indirecting through null pointers. (cxx_eval_constant_expression): Reject invalid expressions involving null pointers. gcc/testsuite/ChangeLog: PR c++/60760 PR c++/71091 * g++.dg/cpp0x/constexpr-cast.C: New test. * g++.dg/cpp0x/constexpr-nullptr-2.C: New test. * g++.dg/cpp1y/constexpr-sfinae.C: Correct. * g++.dg/ubsan/pr63956.C: Correct. Added: trunk/gcc/testsuite/g++.dg/cpp0x/constexpr-cast.C trunk/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr-2.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/constexpr.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/g++.dg/cpp1y/constexpr-sfinae.C trunk/gcc/testsuite/g++.dg/ubsan/pr63956.C
Fixed by r238909.