https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95385
--- Comment #3 from Haoxin Tu <haoxintu at gmail dot com> ---
(In reply to Richard Biener from comment #2)
> We likely eliminate the dead 0/0 and 0/b instructions but fail for the one in
> the loop at -O0. As soon as the actual instruction is carried out the
> program traps and obviously further runtime messages are no longer emitted.
>
> There's no bug here.
Hi Richard, take look at this case
test3.cc
#include<iostream>
int main () {
for (int i = 0; i < 1; ++i) {
int a1 = 0;
int aa1 = a1/0;
}
int b = 0;
int bb = 0 / b;
0 / 0;
std::cout << "ok" << std::endl;
return 0;
}
$./g++ -w -fsanitize=integer-divide-by-zero test3.cc ; ./a.out
test3.cc:5:21: runtime error: division by zero
The actual instruction is carried out as you said.
But in test4.cc
#include<iostream>
int main () {
for (int i = 0; i < 1; ++i) {
int b = 0;
int bb = 0 / b;
0 / 0;
}
int b = 0;
int bb = 0 / b;
0 / 0;
std::cout << "ok" << std::endl;
return 0;
}
$$./g++ -w -fsanitize=integer-divide-by-zero test4.cc ; ./a.out
test4.cc:5:20: runtime error: division by zero
test4.cc:6:11: runtime error: division by zero
test4.cc:9:16: runtime error: division by zero
test4.cc:10:7: runtime error: division by zero
ok
I am wondering why GCC treats test3.cc and test4.cc differently. Is there
something I didn’t understand correctly?