[Bug c++/70331] New: missing error dereferencing a dangling pointer in constexpr function
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sun Mar 20 23:51:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70331
Bug ID: 70331
Summary: missing error dereferencing a dangling pointer in
constexpr function
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
The constexpr function f in the test case below has well-defined behavior only
when its argument is non-zero. When its argument is zero, the function returns
a value obtained by dereferencing a dangling pointer. Since an expression with
undefined behavior is not a valid core constant expression it cannot be used to
initialize a constexpr variable and the whole program below should be rejected
with an error. However, GCC accepts it without a diagnostic.
$ cat x.c && /build/gcc-trunk/gcc/xgcc -B /build/gcc-trunk/gcc -S -Wall -Wextra
-Wpedantic -o/dev/stdout -xc++ x.c
constexpr int f (int i)
{
int *p = &i;
if (i == 0) {
int j = 123;
p = &j;
}
return *p;
}
constexpr int i = f (0);
const int j = i;
For comparison, Clang produces the following output:
x.c:12:15: error: constexpr variable 'i' must be
initialized by a constant expression
constexpr int i = f (0);
^ ~~~~~
x.c:9:12: note: read of object outside its
lifetime is not allowed in a constant expression
return *p;
^
x.c:12:19: note: in call to 'f(0)'
constexpr int i = f (0);
^
1 error generated.
More information about the Gcc-bugs
mailing list