undefined-behavior相关内容

未定义行为和已形成,无诊断消息之间的区别

C ++标准提供了惊人的定义 1 行为,这意味着微妙的差异或多或少相同。阅读此答案,我注意到了“该程序不正常,无需诊断”的说法。 实施定义不同于未指定行为,前一种情况的实施必须清楚地记录它在做(在后一种情况下,它不需要),两者都是良好形成的 。 未定义的行为与未指定的行为有所不同,因为程序是错误的(1.3.13)。 否则,所有标准都没有假设或关于实现将做什么的要求。 除了1.4 / ..
发布时间:2016-10-13 11:24:29 C/C++开发

可观察的行为和未定义的行为 - 如果我不调用析构函数会发生什么?

注意:我已经看过类似的问题,但没有一个答案足够精确,所以我自己问。 这是一个非常nitpicky“语言律师”的问题;我正在寻找一个权威的答案。 C ++标准说: 程序可以通过重用对象占用的存储器或通过显式调用具有非平凡析构函数的类类型的对象的析构函数来结束任何对象的生命周期。对于具有非平凡析构函数的类类型的对象,程序不需要在对象占用的存储被重新使用或释放​​之前明确地调用析构函数 ..
发布时间:2016-10-13 11:21:30 C/C++开发

如何解释未定义的行为知道所有的新手?

C ++标准属性定义为未定义行为的情况很少。例如,如果我使用 new [] 分配,则尝试使用 delete 删除[] )是未定义的行为 - 任何事情都可能发生 - 它可能会工作,它可能会匆忙崩溃,可能会悄悄地破坏一些东西并产生时间问题。 这是有问题的,解释这可能发生的任何事情部分到新手。他们开始“证明”“这工作”(因为它真的工作在他们使用的C ++实现),并问“这可能是什么错误的”? ..
发布时间:2016-10-13 11:12:05 C/C++开发

为什么f(i = -1,i = -1)未定义行为?

我在阅读关于违反评估次序的订单,他们给出一个令我困惑的例子。 / p> 1)如果对标量对象的副作用相对于同一标量对象上的另一个副作用未排序,那么行为是未定义的。 // snip f(i = -1,i = -1) // undefined behavior 在此上下文中, i 是一个标量对象,它显然意味着 算术类型.1),枚举类型,指针类 ..
发布时间:2016-10-13 10:51:07 C/C++开发

不评估应用sizeof的表达式是否合法,在C ++中解析sizeof中的空指针或无效指针?

首先,我看到了关于C99的这个问题,并且接受的答案参考操作数不是在C99标准草案中评估了字样。我不知道这个答案适用于C ++ 03。还有有关C ++的这个问题,它有一个接受的答案,引用了类似的措辞和在一些上下文中,未评估的操作数出现。未评估的操作数未评估。 我有此代码: int * ptr = 0; void * buffer = malloc(10 * sizeof(* ptr ..

在其中C ++标准的版本“(i + = 10)+ = 10”有未定义的行为?

在C ++中,以下是否有未定义的行为: int i = 0; (i + = 10)+ = 10; 在我的回答 在C和C ++中+ =的结果是什么?这里的细微之处是,默认响应似乎是“是”,而正确的答案是“它取决于C ++标准的版本”。 如果它依赖于标准的版本,请解释UB在哪里和不在哪里。 解决方案 tl; dr :(i + = 10)+中执行的修改 ..
发布时间:2016-10-13 10:21:44 C/C++开发

为什么是未定义的行为通过基指针删除[]一个派生对象数组?

我在 5.3.5 [expr.delete] p3 下找到C ++ 03标准中的以下片段: 在第一个替换( delete object )中,如果要删除的对象的静态类型与其动态类型不同,则静态类型应为操作数动态类型的基类和静态类型应具有虚析构函数或行为未定义。 如果要删除的对象的动态类型与其静态类型不同,则在第二个替换(删除数组)中,行为是未定义的。 快速查看静态和动态类型: ..
发布时间:2016-10-13 10:08:05 C/C++开发

混合类和结构体

我很清楚类和结构之间的区别,但我努力授权说如果这是很好定义: // declare foo(struct) struct foo; //定义foo(类) 类foo { }; // foo的实例,声称是一个结构体!定义好? struct foo bar; //混合类和结构,像这样至少一个编译器(名称被不同地改变) const foo& test(){ ret ..
发布时间:2016-10-11 23:16:24 C/C++开发

那么为什么i = ++ i + 1在C ++ 11中定义良好?

我看过其他类似问题,并阅读缺陷它。但我还是不明白。为什么 i = i ++ + 1 是在C ++ 11中定义的 i = ++ i + 1 不? 通过我的锻炼,我在图表之前有以下顺序(其中箭头代表顺序)除非另有说明,否则关系和一切都是值计算): i = ++ i + 1 ^ | 赋值(对i的副作用) ^ ^ | | ☆i ++ i + 1 || ^ i + = ..
发布时间:2016-10-11 23:04:29 C/C++开发

这是无限递归UB吗?

在C ++ 11中,作为没有副作用的无限循环,以下程序是UB: int main(){ while(true){} } 还有UB? void foo(){ foo } int main(){ foo(); } 两个程序的标准引用都是理想的。 $这是UB,因为它不是在循环语句,而是在(1.10p24): $ b $ b ..
发布时间:2016-10-11 22:19:39 C/C++开发

为什么超越指针运算未定义的行为?

以下示例是来自维基百科的 。 int arr [4] = {0,1,2,3}; int * p = arr + 5; //未定义的行为 如果我从不取消引用p,那么为什么是arr + 5单独的未定义行为?我希望指针表现为整数 - 除非被解引用,指针的值被认为是内存地址。 解决方案 这是因为指针的行为不像整数。 在大多数平台上(如果不是全部),你不会遇到 ..
发布时间:2016-10-11 22:05:01 C/C++开发

近恒定时间旋转,不违反标准

我有一个时间试图想出一个不违反C / C ++标准的恒定时间旋转。 问题是边缘/角落情况,其中在算法中调出操作,并且那些算法不能被改变。例如,以下内容来自 Crypto ++ ,并在 GCC ubsan (即 g ++ fsanitize = undefined ): $ ./cryptest.exe v | grep运行时 misc.h:637:22:运行时错误:移位指数32对于 ..