在 C++ 中,将未初始化的变量传递给函数是否被视为 UB?[复制]

Is passing the uninitialized variable to function considered UB in C++? [duplicate]

提问人:Greg 提问时间:11/10/2023 更新时间:11/10/2023 访问量:54

问:

最近我在写我的光线追踪器项目时,在其中犯了一些错误。我有一个函数:

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 编译程序,它会关闭所有优化还是我需要另一个标志?

谢谢!

C++ undefined-behavior 返回值优化 清理程序

评论

0赞 user12002570 11/10/2023
“未定义的行为意味着任何事情都可能发生,包括但不限于程序提供预期的输出。但永远不要依赖具有 UB 的程序的输出。程序可能会崩溃。
0赞 Pepijn Kramer 11/10/2023
从酉化变量 UB 读取,无论读取的路径多么复杂。写信给它很好(即使通过参考文献)
0赞 user12002570 11/10/2023
实际上,通过引用传递不是 UB,但如果您要评估函数内部的参数,那么它将是 UB。请参阅欺骗:按引用传递未初始化变量是未定义的行为吗?)
0赞 user12002570 11/10/2023
使用正在初始化的变量调用函数

答: 暂无答案