undefined-behavior相关内容
C ++标准提供了惊人的定义 1 行为,这意味着微妙的差异或多或少相同。阅读此答案,我注意到了“该程序不正常,无需诊断”的说法。 实施定义不同于未指定行为,前一种情况的实施必须清楚地记录它在做(在后一种情况下,它不需要),两者都是良好形成的 。 未定义的行为与未指定的行为有所不同,因为程序是错误的(1.3.13)。 否则,所有标准都没有假设或关于实现将做什么的要求。 除了1.4 /
..
注意:我已经看过类似的问题,但没有一个答案足够精确,所以我自己问。 这是一个非常nitpicky“语言律师”的问题;我正在寻找一个权威的答案。 C ++标准说: 程序可以通过重用对象占用的存储器或通过显式调用具有非平凡析构函数的类类型的对象的析构函数来结束任何对象的生命周期。对于具有非平凡析构函数的类类型的对象,程序不需要在对象占用的存储被重新使用或释放之前明确地调用析构函数
..
我只是想知道如何灾难性的整数溢出真的是。采取以下示例程序: #include int main() { int a = 46341; int b = a * a; std :: cout
..
C ++标准属性定义为未定义行为的情况很少。例如,如果我使用 new [] 分配,则尝试使用 delete 删除[] )是未定义的行为 - 任何事情都可能发生 - 它可能会工作,它可能会匆忙崩溃,可能会悄悄地破坏一些东西并产生时间问题。 这是有问题的,解释这可能发生的任何事情部分到新手。他们开始“证明”“这工作”(因为它真的工作在他们使用的C ++实现),并问“这可能是什么错误的”?
..
我在阅读关于违反评估次序的订单,他们给出一个令我困惑的例子。 / p> 1)如果对标量对象的副作用相对于同一标量对象上的另一个副作用未排序,那么行为是未定义的。 // snip f(i = -1,i = -1) // undefined behavior 在此上下文中, i 是一个标量对象,它显然意味着 算术类型.1),枚举类型,指针类
..
这是我的问题,问题是在注释 const int a = 5; const_cast(a)= 7; // throw over const属性,并赋值给7 std :: cout
..
int * 如果我实际上没有访问取消引用的“对象” p = 0; int& r = * p; // undefined? int * q =& * p; // undefined? 一个更实用的示例:我可以取消引用空指针来区分重载吗? void foo(Bar&); void foo(Baz&); foo(*(Bar *)0); // undef
..
首先,我看到了关于C99的这个问题,并且接受的答案参考操作数不是在C99标准草案中评估了字样。我不知道这个答案适用于C ++ 03。还有有关C ++的这个问题,它有一个接受的答案,引用了类似的措辞和在一些上下文中,未评估的操作数出现。未评估的操作数未评估。 我有此代码: int * ptr = 0; void * buffer = malloc(10 * sizeof(* ptr
..
C ++标准中的§3.9.1/ 6部分说, bool类型的值为 true 或 false 。 此代码 void f(bool b) { switch是bool,它的值可以是true或false! { case true:cout
..
在C ++中,以下是否有未定义的行为: int i = 0; (i + = 10)+ = 10; 在我的回答 在C和C ++中+ =的结果是什么?这里的细微之处是,默认响应似乎是“是”,而正确的答案是“它取决于C ++标准的版本”。 如果它依赖于标准的版本,请解释UB在哪里和不在哪里。 解决方案 tl; dr :(i + = 10)+中执行的修改
..
我在 5.3.5 [expr.delete] p3 下找到C ++ 03标准中的以下片段: 在第一个替换( delete object )中,如果要删除的对象的静态类型与其动态类型不同,则静态类型应为操作数动态类型的基类和静态类型应具有虚析构函数或行为未定义。 如果要删除的对象的动态类型与其静态类型不同,则在第二个替换(删除数组)中,行为是未定义的。 快速查看静态和动态类型:
..
可能重复: 不要调用 delete new 或 new []或 ] 在C ++程序中是一个未定义的行为或只是一个内存泄漏? 欢迎来自标准的参考(如果有)。 这是在
..
MSVC实现的示例: #define offsetof(s,m)\ (size_t)& ; reinterpret_cast((((s *)0) - > m)) // ^^^^^^^^^^^ 可以看出,它解引用一个空指针,通常调用未定义的行为。 解决方案 语言标准说“未定义的行为”时,任何给定的编译器可以定义行为
..
我必须在这里绝对疯狂,但在我的机器上的 gcc 4.7.3 是最荒谬的结果。这里是我测试的确切代码: #include b)> b; cout
..
我很清楚类和结构之间的区别,但我努力授权说如果这是很好定义: // declare foo(struct) struct foo; //定义foo(类) 类foo { }; // foo的实例,声称是一个结构体!定义好? struct foo bar; //混合类和结构,像这样至少一个编译器(名称被不同地改变) const foo& test(){ ret
..
我看过其他类似问题,并阅读缺陷它。但我还是不明白。为什么 i = i ++ + 1 是在C ++ 11中定义的 i = ++ i + 1 不? 通过我的锻炼,我在图表之前有以下顺序(其中箭头代表顺序)除非另有说明,否则关系和一切都是值计算): i = ++ i + 1 ^ | 赋值(对i的副作用) ^ ^ | | ☆i ++ i + 1 || ^ i + =
..
这个问题与'不同。 $ b $ b struct B { virtual void foo(); 〜B(){} //
..
在C ++ 11中,作为没有副作用的无限循环,以下程序是UB: int main(){ while(true){} } 还有UB? void foo(){ foo } int main(){ foo(); } 两个程序的标准引用都是理想的。 $这是UB,因为它不是在循环语句,而是在(1.10p24): $ b $ b
..
以下示例是来自维基百科的 。 int arr [4] = {0,1,2,3}; int * p = arr + 5; //未定义的行为 如果我从不取消引用p,那么为什么是arr + 5单独的未定义行为?我希望指针表现为整数 - 除非被解引用,指针的值被认为是内存地址。 解决方案 这是因为指针的行为不像整数。 在大多数平台上(如果不是全部),你不会遇到
..
我有一个时间试图想出一个不违反C / C ++标准的恒定时间旋转。 问题是边缘/角落情况,其中在算法中调出操作,并且那些算法不能被改变。例如,以下内容来自 Crypto ++ ,并在 GCC ubsan (即 g ++ fsanitize = undefined ): $ ./cryptest.exe v | grep运行时 misc.h:637:22:运行时错误:移位指数32对于
..