https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83382
Bug ID: 83382
Summary: UBSAN tiggers false-positive warning
[-Werror=uninitialized]
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: sanitizer
Assignee: unassigned at gcc dot gnu.org
Reporter: babokin 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, marxin at
gcc dot gnu.org
Target Milestone: ---
gcc trunk, rev 255537, x86_64.
Not sure if this is duplicate of #42145 or not, so filing as a separate bug.
The issue goes away if either sanitizer flags removed, "extern" removed from
tf_0_var_14 definition, or "const" removed from the same definition. Though it
points to different variable. So, something fishy is going on here.
You may argue that this analysis is inexact and I shouldn't rely on that, but
it's definitely usability bug, when unrelated things are causing troubles. And
it stops me from using -Werror=uninitialized in test case reduction, where it
really does useful job.
> cat f.cpp
int tf_0_var_36;
signed char tf_0_var_58;
extern const int tf_0_var_14;
int *tf_0_ptr_8;
void tf_0_foo() {
tf_0_var_36 >> ((!0 || tf_0_var_58) && (0 ? tf_0_var_14 : *tf_0_ptr_8));
}
> g++ -std=c++11 -fsanitize=undefined -Werror=uninitialized -o
> ubsan_gcc_o2_func.o -c f.cpp
f.cpp: In function ‘void tf_0_foo()’:
f.cpp:6:72: error: ‘tf_0_ptr_8.1’ is used uninitialized in this function
[-Werror=uninitialized]
tf_0_var_36 >> ((!0 || tf_0_var_58) && (0 ? tf_0_var_14 : *tf_0_ptr_8));
^
cc1plus: some warnings being treated as errors