undefined-behavior相关内容
如果我没有真正访问解引用的“对象",解引用空指针是否仍然未定义? int* p = 0;内部&r = *p;//不明确的?int* q = &*p;//不明确的? 一个稍微实际一点的例子:我可以取消引用空指针来区分重载吗? void foo(Bar&);void foo(Baz&);foo(*(Bar*)0);//不明确的? 好的,根据标准,参考示例肯定是未定义的行为: 在定义良好的
..
我很清楚class 和 struct 之间的区别,但是我很难权威地说这是否定义明确: //声明 foo(struct)结构 foo;//定义 foo(类)类 foo {};//foo 的实例,又声称是一个结构体!定义好?结构 foo 栏;//像这样混合类和结构至少会扰乱一个编译器(名称被不同地修改)const foo&测试() {返回栏;}int main() {测试();返回0;} 如果这是
..
我很惊讶地发现以下方法有效: #include int main(int argc, char** argv){结构 Foo {Foo(Foo& bar) {std::cout
..
这是一个代码片段. x = {}x[1] = len(x)打印 x{1:0} 这个定义清楚吗?也就是说,可以 x == {1: 1} 代替吗? 因为我记得 C++ '98 中的等效程序(如果我们使用 std::map)具有未定义的行为.用VS编译器和G++编译时,程序的输出是不同的. 解决方案 正如我在评论中提到的,这个测试用例可以简化为: x = {}x[1] = len(x
..
我写了一个简单的多线程程序如下: static bool 完成 = false;函数函数(){size_t i = 0;而(!完成)++i;返回我;}int main(){自动结果=std::async(std::launch::async, func);std::this_thread::sleep_for(std::chrono::seconds(1));完成=真;std::cout
..
乍一看,这个问题似乎是 How检测整数溢出?,但实际上有很大不同. 我发现虽然检测无符号整数溢出非常简单,但检测 C/C++ 中的有符号溢出实际上比大多数人想象的要困难. 最明显但最幼稚的方法是: int add(int lhs, int rhs){int sum = lhs + rhs;if ((lhs >= 0 && sum
..
考虑这个程序: #include int main(void){无符号整数 a;printf("%u %u\n", a^a, a-a);返回0;} 这是未定义的行为吗? 从表面上看,a 是一个未初始化的变量.所以这指向未定义的行为.但是对于 a 的所有值,a^a 和 aa 都等于 0,至少我认为是案子.是否有可能以某种方式证明该行为是明确定义的? 解决方案 在 C11 中:
..
我要问的是众所周知的“结构的最后一个成员具有可变长度"的技巧.它是这样的: struct T {内里;字符 [1];};struct T *p = malloc(sizeof(struct T) + 100);p->len = 100;strcpy(p->s, "你好世界"); 由于结构体在内存中的布局方式,我们能够将结构体覆盖在一个大于必要的块上,并将最后一个成员视为大于 1 个字符指定.
..
#include int main(){const int a = 12;国际*p;p = &a;*p = 70;} 它会起作用吗? 解决方案 这是“未定义的行为",这意味着根据标准,您无法预测尝试此操作时会发生什么.根据特定的机器、编译器和程序的状态,它可能会做不同的事情. 在这种情况下,最常发生的是答案是“是".变量,无论是否为常量,都只是内存中的一个位置,您可以打破常量的规则
..
如果我有: unsigned int x;x -= x; 很明显x应该在这个表达式之后是零,但是我到处看,他们说这段代码的行为是未定义的,不仅仅是 x 的值(直到减法之前). 两个问题: 这段代码的行为是否确实未定义? (例如,代码是否会在兼容系统上崩溃 [或更糟]?) 如果是这样,为什么 C 说 行为 是未定义的,而 x 此处应该为零? 即不在这里定义行为有什么优势
..
#include int main(void){int i = 0;i = i++ + ++i;printf("%d\n", i);//3我 = 1;i = (i++);printf("%d\n", i);//2 应该是 1,不是吗?易失性 int u = 0;u = u++ + ++u;printf("%d\n", u);//1u = 1;u = (u++);printf("%d\n", u);
..
C++ 标准在 3.3.2“声明点"中包含一个半著名的“令人惊讶"名称查找示例: int x = x; 这用自身初始化 x,它(作为原始类型)未初始化,因此具有不确定的值(假设它是一个自动变量). 这实际上是未定义的行为吗? 根据4.1“左值到右值转换",对未初始化的值执行左值到右值转换是未定义的行为.右手边的 x 是否进行了这种转换?如果是这样,该示例实际上是否会有未定义的行为?
..
已更新,见下文! 我听说并读到 C++0x 允许编译器为以下代码段打印“Hello" #include int main() {同时(1);std::cout
..
众所周知,有符号整数溢出是未定义的行为.但是在 C++11 cstdint 文档中有一些有趣的东西: 宽度分别为 8、16、32 和 64 位的有符号整数类型,没有填充位,对负值使用 2 的补码(仅当实现直接支持该类型时才提供)> 见链接 这是我的问题:因为标准明确规定对于 int8_t、int16_t、int32_t 和 int64_t> 负数是 2 的补码,这些类型的溢出仍然是未
..
C 和 C++ 标准都很好地定义了无符号整数溢出.例如,C99 标准(§6.2.5/9) 状态 涉及无符号操作数的计算永远不会溢出,因为无法由结果无符号整数类型表示的结果是以比可以得到的最大值大 1 的数为模减少由结果类型表示. 然而,两个标准都声明有符号整数溢出是未定义的行为.同样,来自 C99 标准 (§3.4.3/1) 未定义行为的一个例子是整数溢出行为 这种差异是否
..
“未定义行为"的经典伪造示例当然是“鼻魔"— 无论 C 和 C++ 标准允许什么,这在物理上都是不可能的. 因为 C 和 C++ 社区倾向于如此强调未定义行为的不可预测性,以及允许编译器在遇到未定义行为时使程序按字面意思做任何事情的想法,我曾假设标准对未定义的行为没有任何限制. 但是 C++ 标准中的相关引用似乎是 一个>: [C++14: defns.undefined]:
..
如初始化是否需要左值右值转换?是 int x = x; UB 吗? C++ 标准在 3.3.2 声明点 部分有一个令人惊讶的例子,其中int 用它自己的不确定值初始化: int x = 12;{ int x = x;} 这里第二个 x 用它自己的(不确定的)值初始化.— 结束示例 ] Johannes 对这个问题的回答表明是未定义的行为,因为它需要左值到右值的转换. 在最新的 C+
..
我编写了一个简单的俄罗斯方块游戏,其中每个块都是单块类的一个实例. class SingleBlock{民众:SingleBlock(int, int);~单块();整数 x;输入 y;SingleBlock *next;};类多块{民众:多块(整数,整数);单块 *c, *d, *e, *f;};SingleBlock::SingleBlock(int a, int b){x = 一个;y =
..
考虑以下代码: #include 结构体{//(一种):void bar() { std::cout
..
C++ 程序员应该知道哪些常见的未定义行为? 说,比如: a[i] = i++; 解决方案 指针 取消引用NULL 指针 取消引用由“new"返回的指针大小为零的分配 使用指向生命周期结束的对象的指针(例如,堆栈分配的对象或删除的对象) 取消引用尚未明确初始化的指针 执行指针运算,产生超出数组边界(上方或下方)的结果. 在数组末尾以外的位置取消引用指针. 转换指向不兼
..