https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120471
Bug ID: 120471
Summary: -fsanitize=undefined causes read of uninitialized
variable when accessing element in an array at -O0
level
Product: gcc
Version: 15.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: sanitizer
Assignee: unassigned at gcc dot gnu.org
Reporter: xiaohuba2021 at 163 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: ---
The following code:
```
volatile int b[1], ib[1];
void build(int ll) {
volatile int c = 21;
volatile int v = (ll % 2 ? b : ib)[c % 3];
if (v != 0)
__builtin_abort();
return;
}
int main() {
build(1), build(2);
return 0;
}
```
will produce the following warning during runtime:
```
/app/example.cpp:5:43: runtime error: index 1 out of bounds for type 'int [1]'
/app/example.cpp:5:43: runtime error: load of address 0x00000040413c with
insufficient space for an object of type 'volatile int'
0x00000040413c: note: pointer points here
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00
^
```
Note that it also got a strange warning during compiling:
```
<source>: In function 'void build(int)':
<source>:5:40: warning: 'c.3' may be used uninitialized [-Wmaybe-uninitialized]
5 | volatile int v = (ll % 2 ? b : ib)[c % 3];
| ~~^~~
<source>:5:38: note: 'c.3' was declared here
5 | volatile int v = (ll % 2 ? b : ib)[c % 3];
| ^
```
Compiled with `-O0 -fsanitize=undefined -Wall`.
-O1 hides it, but the warning still presents.
g++ -v:
```
x86-64 gcc 15.1 - cached (9476B) ~400 lines filtered
Using built-in specs.
COLLECT_GCC=/opt/compiler-explorer/gcc-15.1.0/bin/g++
Target: x86_64-linux-gnu
Configured with: ../gcc-15.1.0/configure
--prefix=/opt/compiler-explorer/gcc-build/staging
--enable-libstdcxx-backtrace=yes --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu --disable-bootstrap
--enable-multiarch --with-abi=m64 --with-multilib-list=m32,m64,mx32
--enable-multilib --enable-clocale=gnu
--enable-languages=c,c++,fortran,ada,objc,obj-c++,go,d,m2,rust,cobol
--enable-ld=yes --enable-gold=yes --enable-libstdcxx-debug
--enable-libstdcxx-time=yes --enable-linker-build-id --enable-lto
--enable-plugins --enable-threads=posix
--with-pkgversion=Compiler-Explorer-Build-gcc--binutils-2.42
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 15.1.0 (Compiler-Explorer-Build-gcc--binutils-2.42)
COLLECT_GCC_OPTIONS='-fdiagnostics-color=always' '-g' '-o' '/app/output.s'
'-masm=intel' '-fno-verbose-asm' '-S' '-O0' '-fsanitize=undefined' '-Wall' '-v'
'-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' '/app/'
/opt/compiler-explorer/gcc-15.1.0/bin/../libexec/gcc/x86_64-linux-gnu/15.1.0/cc1plus
-quiet -v -imultiarch x86_64-linux-gnu -iprefix
/opt/compiler-explorer/gcc-15.1.0/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/
-D_GNU_SOURCE <source> -quiet -dumpdir /app/ -dumpbase output.cpp -dumpbase-ext
.cpp -masm=intel -mtune=generic -march=x86-64 -g -O0 -Wall -version
-fdiagnostics-color=always -fno-verbose-asm -fsanitize=undefined -o
/app/output.s
GNU C++17 (Compiler-Explorer-Build-gcc--binutils-2.42) version 15.1.0
(x86_64-linux-gnu)
compiled by GNU C version 11.4.0, GMP version 6.2.1, MPFR version
4.1.0, MPC version 1.2.1, isl version isl-0.24-GMP
```