C++未定义行为(UB)详解与解决方案
未定义行为(Undefined Behavior, UB)是C++开发中最棘手的问题之一,因为它可能导致程序崩溃、安全漏洞或难以调试的异常表现。
1. 什么是未定义行为
定义
未定义行为是指C++标准未明确规定行为的情况,编译器可以采取任何行动,包括产生看似正确的结果、崩溃、安全漏洞等。
特点
- 不可预测性:不同编译器、不同优化级别可能产生不同结果
- 难以调试:症状可能与问题根源相距甚远
- 安全风险:可能被利用造成安全漏洞
2. 常见的未定义行为及解决方案
2.1 内存访问相关UB
空指针解引用
// ❌ 错误示例
void dangerous(int* ptr) {
*ptr = 42; // 如果 ptr 为 nullptr,UB
}
// ✅ 解决方案
void safe(int* ptr) {
if (ptr != nullptr) {
*ptr = 42;
}
// 或者使用断言在调试时捕获
assert(ptr != nullptr && "Pointer must not be null");
}
// ✅ 现代 C++ 方案
void modern_safe(std::optional<int>& opt) {
if (opt) {
*opt = 42;
}
}
越界访问
// ❌ 错误示例
void dangerous_access() {
int arr[5] = {1, , , , };
value = arr[];
arr[] = ;
}
{
std::array<, 5> arr = {, , , , };
{
value = arr.();
} ( std::out_of_range& e) {
std::cerr << << e.() << std::endl;
}
index = ;
(index < arr.()) {
arr[index] = ;
}
}

