提问人:Greg 提问时间:11/10/2023 更新时间:11/10/2023 访问量:54
在 C++ 中,将未初始化的变量传递给函数是否被视为 UB?[复制]
Is passing the uninitialized variable to function considered UB in C++? [duplicate]
问:
这个问题在这里已经有答案了:
按引用传递未初始化变量是未定义的行为吗? (3 个答案)
使用正在初始化的变量调用函数 [duplicate] (1 个答案)
初始化表达式可以使用变量本身吗? (3 个答案)
13天前关闭。
最近我在写我的光线追踪器项目时,在其中犯了一些错误。我有一个函数:
double Length(const Vector& v) {
return std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
}
然后我在这个声明中有一个错别字:
Vector normal = Length(normal) < eps ? intersection.GetNormal() : baricentric.GetNormal();
因此,当传递给函数时,它被声明但未定义(该名称在其他作用域中不存在,但这个)。程序运行不正确,我不得不在发现错误之前使用 gdb 对其进行调试。normal
我希望它应该是 UB,但是当我使用 clang 构建我的项目时,使用以下标志:
set(CMAKE_CXX_FLAGS_ASAN "-g -fsanitize=address,undefined -fno-sanitize-recover=all"
CACHE STRING "Compiler flags in asan build"
FORCE)
在程序运行期间,我没有收到编译器错误甚至运行时错误。
那么是UB吗?USAN应该发现这种错误吗?我有一个假设,问题可能出在某些编译器优化中,(例如 RVO),所以如果我使用 -O0 编译程序,它会关闭所有优化还是我需要另一个标志?
谢谢!
答: 暂无答案
上一个:写出边界矩阵
下一个:不从函数返回不是错误吗?
评论