2022.02.21 UB

参考资料:

https://zhuanlan.zhihu.com/p/141467895

https://blog.csdn.net/ghscarecrow/article/details/115429174

Step 1 UB定义

在 C/C++ 中,和未定义行为容易混淆的概念有两个,实现定义行为未指明行为。这里先对这几个概念做一个辨析。

实现定义行为:程序的行为随实现而变动,遵从标准的实现必须为每个这样的行为的效果提供文档。一个例子是 int 在不同环境下的大小(标准规定为至少 16 位,现在大多数环境下均为 32 位)。

未指明行为:程序的行为随实现而变动,而不要求遵从标准的实现为每个行为的效果提供文档。虽然行为在变动,但它产生的结果均应该是合法的。一个例子是变量分配的方式和位置(可以把一次定义的不同变量分配到一片连续的空间,当然也可以分开分配)。

未定义行为:对程序的行为无任何限制。前两类行为的结果都要求是合法的,而对于未定义行为,则不要求程序做任何合法,有意义的事情。一个例子是访问非法内存。

Step 2 常见产生UB的原因

2.1 越界访问

简而言之,数组越界等 神奇的问题。

2.2 变量没有初始化

如今天做的洛谷5546题,一直没有把 vis 数组初始化,导致二分写挂了。

2.3 有符号整数算数溢出

一些更为神奇的问题,总是忘,直接 #define int long long ,实在不行改成 unsigned long long ,怎么大怎么来,只要不MLE。

Step 3 解决对策

目前除了自己一行一行找,我还布吉岛windows怎么解决这个问题。

Step 4 后记

今天,可怜的eleveni整整把P5546写了三遍,写的都快心态炸裂了!!

 posted on 2022-02-21 20:17  eleveni  阅读(99)  评论(1)    收藏  举报