Recently I was writing my raytracer project and made some bugs in it. I have a function:
double Length(const Vector& v) {
return std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
}
and then I had a typo in this statement:
Vector normal = Length(normal) < eps ? intersection.GetNormal() : baricentric.GetNormal();
So when normal
passed to function it is declared but not defined (the name was not present in other scope, but this). The program ran incorrectly and I had to debug it with gdb before the bug was found.
I expect that it should be UB, but when I built my project with clang, using this flags:
set(CMAKE_CXX_FLAGS_ASAN "-g -fsanitize=address,undefined -fno-sanitize-recover=all"
CACHE STRING "Compiler flags in asan build"
FORCE)
I did not get Compiler Error or even Runtime Error during program run.
So is it UB? Should USAN catch this kind of bugs? I have a hypothesis that the problem may be in some compiler optimizations,( RVO e.g ), so if I would compile program with -O0 will it turn off all optimization or I need another flag?
Thanks!