undefined-behavior相关内容

在什么时候取消引用空指针会变成未定义的行为?

如果我没有真正访问解引用的“对象",解引用空指针是否仍然未定义? int* p = 0;内部&r = *p;//不明确的?int* q = &*p;//不明确的? 一个稍微实际一点的例子:我可以取消引用空指针来区分重载吗? void foo(Bar&);void foo(Baz&);foo(*(Bar*)0);//不明确的? 好的,根据标准,参考示例肯定是未定义的行为: 在定义良好的 ..
发布时间:2021-12-11 19:42:41 C/C++开发

混合类和结构

我很清楚class 和 struct 之间的区别,但是我很难权威地说这是否定义明确: //声明 foo(struct)结构 foo;//定义 foo(类)类 foo {};//foo 的实例,又声称是一个结构体!定义好?结构 foo 栏;//像这样混合类和结构至少会扰乱一个编译器(名称被不同地修改)const foo&测试() {返回栏;}int main() {测试();返回0;} 如果这是 ..
发布时间:2021-12-09 21:25:44 C/C++开发

作业的右侧总是在作业之前进行评估吗?

这是一个代码片段. x = {}x[1] = len(x)打印 x{1:0} 这个定义清楚吗?也就是说,可以 x == {1: 1} 代替吗? 因为我记得 C++ '98 中的等效程序(如果我们使用 std::map)具有未定义的行为.用VS编译器和G++编译时,程序的输出是不同的. 解决方案 正如我在评论中提到的,这个测试用例可以简化为: x = {}x[1] = len(x ..
发布时间:2021-12-08 13:05:21 Python

检测 C/C++ 中的有符号溢出

乍一看,这个问题似乎是 How检测整数溢出?,但实际上有很大不同. 我发现虽然检测无符号整数溢出非常简单,但检测 C/C++ 中的有符号溢出实际上比大多数人想象的要困难. 最明显但最幼稚的方法是: int add(int lhs, int rhs){int sum = lhs + rhs;if ((lhs >= 0 && sum ..
发布时间:2021-12-02 08:29:11 C/C++开发

如果 a 未初始化,a^a 或 a-a 是未定义的行为吗?

考虑这个程序: #include int main(void){无符号整数 a;printf("%u %u\n", a^a, a-a);返回0;} 这是未定义的行为吗? 从表面上看,a 是一个未初始化的变量.所以这指向未定义的行为.但是对于 a 的所有值,a^a 和 aa 都等于 0,至少我认为是案子.是否有可能以某种方式证明该行为是明确定义的? 解决方案 在 C11 中: ..
发布时间:2021-12-02 08:20:06 其他开发

是“结构黑客"吗?技术上未定义的行为?

我要问的是众所周知的“结构的最后一个成员具有可变长度"的技巧.它是这样的: struct T {内里;字符 [1];};struct T *p = malloc(sizeof(struct T) + 100);p->len = 100;strcpy(p->s, "你好世界"); 由于结构体在内存中的布局方式,我们能够将结构体覆盖在一个大于必要的块上,并将最后一个成员视为大于 1 个字符指定. ..
发布时间:2021-12-02 08:12:31 其他开发

我们可以通过指针改变用 const 定义的对象的值吗?

#include int main(){const int a = 12;国际*p;p = &a;*p = 70;} 它会起作用吗? 解决方案 这是“未定义的行为",这意味着根据标准,您无法预测尝试此操作时会发生什么.根据特定的机器、编译器和程序的状态,它可能会做不同的事情. 在这种情况下,最常发生的是答案是“是".变量,无论是否为常量,都只是内存中的一个位置,您可以打破常量的规则 ..
发布时间:2021-12-02 08:09:32 其他开发

(为什么)正在使用未初始化的变量未定义行为?

如果我有: unsigned int x;x -= x; 很明显x应该在这个表达式之后是零,但是我到处看,他们说这段代码的行为是未定义的,不仅仅是 x 的值(直到减法之前). 两个问题: 这段代码的行为是否确实未定义? (例如,代码是否会在兼容系统上崩溃 [或更糟]?) 如果是这样,为什么 C 说 行为 是未定义的,而 x 此处应该为零? 即不在这里定义行为有什么优势 ..
发布时间:2021-12-01 23:37:13 其他开发

初始化是否需要左值到右值的转换?是`int x = x;` UB 吗?

C++ 标准在 3.3.2“声明点"中包含一个半著名的“令人惊讶"名称查找示例: int x = x; 这用自身初始化 x,它(作为原始类型)未初始化,因此具有不确定的值(假设它是一个自动变量). 这实际上是未定义的行为吗? 根据4.1“左值到右值转换",对未初始化的值执行左值到右值转换是未定义的行为.右手边的 x 是否进行了这种转换?如果是这样,该示例实际上是否会有未定义的行为? ..
发布时间:2021-12-01 15:48:42 C/C++开发

有符号整数溢出在 C++ 中仍然是未定义的行为吗?

众所周知,有符号整数溢出是未定义的行为.但是在 C++11 cstdint 文档中有一些有趣的东西: 宽度分别为 8、16、32 和 64 位的有符号整数类型,没有填充位,对负值使用 2 的补码(仅当实现直接支持该类型时才提供)> 见链接 这是我的问题:因为标准明确规定对于 int8_t、int16_t、int32_t 和 int64_t> 负数是 2 的补码,这些类型的溢出仍然是未 ..
发布时间:2021-12-01 15:37:21 C/C++开发

为什么无符号整数溢出定义了行为,但有符号整数溢出不是?

C 和 C++ 标准都很好地定义了无符号整数溢出.例如,C99 标准(§6.2.5/9) 状态 涉及无符号操作数的计算永远不会溢出,因为无法由结果无符号整数类型表示的结果是以比可以得到的最大值大 1 的数为模减少由结果类型表示. 然而,两个标准都声明有符号整数溢出是未定义的行为.同样,来自 C99 标准 (§3.4.3/1) 未定义行为的一个例子是整数溢出行为 这种差异是否 ..
发布时间:2021-12-01 15:14:09 C/C++开发

是否“未定义的行为"真的允许*任何*发生吗?

“未定义行为"的经典伪造示例当然是“鼻魔"— 无论 C 和 C++ 标准允许什么,这在物理上都是不可能的. 因为 C 和 C++ 社区倾向于如此强调未定义行为的不可预测性,以及允许编译器在遇到未定义行为时使程序按字面意思做任何事情的想法,我曾假设标准对未定义的行为没有任何限制. 但是 C++ 标准中的相关引用似乎是 一个>: [C++14: defns.undefined]: ..
发布时间:2021-12-01 15:04:25 C/C++开发

C++ 标准是否在 C++14 中关于不确定值和未定义行为的使用发生了变化?

如初始化是否需要左值右值转换?是 int x = x; UB 吗? C++ 标准在 3.3.2 声明点 部分有一个令人惊讶的例子,其中int 用它自己的不确定值初始化: int x = 12;{ int x = x;} 这里第二个 x 用它自己的(不确定的)值初始化.— 结束示例 ] Johannes 对这个问题的回答表明是未定义的行为,因为它需要左值到右值的转换. 在最新的 C+ ..
发布时间:2021-12-01 15:03:40 C/C++开发

C++ 程序员应该知道哪些常见的未定义行为?

C++ 程序员应该知道哪些常见的未定义行为? 说,比如: a[i] = i++; 解决方案 指针 取消引用NULL 指针 取消引用由“new"返回的指针大小为零的分配 使用指向生命周期结束的对象的指针(例如,堆栈分配的对象或删除的对象) 取消引用尚未明确初始化的指针 执行指针运算,产生超出数组边界(上方或下方)的结果. 在数组末尾以外的位置取消引用指针. 转换指向不兼 ..
发布时间:2021-12-01 14:47:23 C/C++开发