- 分享
浅谈ub行为(未定义行为Undefined Behavior)
- 2024-11-14 21:14:00 @
我们通常会遇到不开 -O2
能过或者本地能过, 开了/提交 就 // 了,到底是因为什么呢?此时,程序就有可能存在ub
所以说什么是ub?
ub(未定义行为Undefined Behavior)是一类对程序无任何限制的行为,在 C++ 中,ub行为的例子众多,下文将会提到一些例子
如果你的程序 ,建议检测是否ub,与其他评测结果不同, 的一般原因是ub
1. 带符号整数形运算溢出(short
/int
/long
/long long
)
例:
#include <bits/stdc++.h>
using namespace std;
signed main() {
int num = 2147483647;
cout << num + 1;
}
输出结果是 -2147483648
因为 int
的范围是 -2147483648
~ 2147483647
然而运算结果是 2147483648
注意! unsigned
整数型是自然溢出不是ub行为
2. 越界访问
越界访问通常因为数组 开大/开小 ,会由于非法访问内存
3. 访问未初始化的变量
#include <iostream>
using namespace std;
signed main() {
int num;
if(num) cout<<"True"<<endl;
if(!num) cout<<"False"<<endl;
}
#include <iostream>
using namespace std;
int num;
signed main() {
if(num) cout<<"True"<<endl;
if(!num) cout<<"False"<<endl;
}
第1个程序存在ub,num
是在主函数 main
中的局部变量,不会初始化需要自行赋值;第2个程序中 num
是全局变量会被初始化值为 0
无需自行赋值,不存在ub
4. 无法确定运算顺序
例:
num++ + ++num
(敬请期待)
0 comments
No comments so far...