https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121731
Bug ID: 121731
Summary: "not a constant expression" compile error when ubsan
enabled, compiles fine on clang
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: sanitizer
Assignee: unassigned at gcc dot gnu.org
Reporter: carlosgalvezp at gmail dot com
CC: dodji at gcc dot gnu.org, dvyukov at gcc dot gnu.org,
jakub at gcc dot gnu.org, kcc at gcc dot gnu.org
Target Milestone: ---
Created attachment 62250
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=62250&action=edit
Reduced example
Hi,
We are hitting a compiler error when building on GCC trunk and UBSAN enabled,
please find the attached reduced example (apologies for the lack of
readability, it comes straight out of creduce :)).
Compiling with:
$ g++ -fsanitize=undefined -c test.ii
Gives:
test.ii:5:49: error: ‘(((const int*)(& da::dd.bk<int, b<1>, b<3> >::bs.bl<int,
b<1>, b<3> >::h)) != 0)’ is not a constant expression
5 | constexpr d(const int *e, int) : f{e}, ae{} { f ? (void)0 :
assertFail(); }
|
The code compiles fine without -fsanitize=undefined. Clang compiles just fine
with or without sanitizer, see results on Godbolt:
https://godbolt.org/z/6WKqsGY6x
Essentially the code at line 5 is asserting that the input pointer "e" is not
nullptr. The rest of the code does not instantiate the class with a nullptr,
thus the assert is not triggered and the code can be constexpr. But somehow
ubsan breaks that. Clang's ubsan doesn't.
So I wanted to check with you if you believe this is a bug in GCC's ubsan or if
this case is simply not expected to be supported.
Thank you!