undefined-behavior相关内容
我有一些在不同平台上运行的代码似乎得到了不同的结果.我正在寻找适当的解释. 我希望将 unsigned 转换为 float 或 double 与 int 的工作方式相同1. 视窗: double dbl = -123.45;int d_cast = (unsigned int)dbl;//d_cast == -123 WinCE (ARM): double dbl = -123.
..
考虑一下: #include 使用命名空间标准;int main(void){const int a1 = 40;const int* b1 = &a1;char* c1 = (char *)(b1);*c1 = 'A';int *t = (int*)c1;cout
..
这个答案引用了 C++11 Standard 3.8: 如果没有显式调用析构函数或者如果没有使用删除表达式(5.3.5)来释放存储,则不应隐式调用析构函数,任何依赖于由析构函数产生的副作用的程序析构函数有未定义的行为. 关于未调用析构函数的部分很清楚.现在假设跳过的析构函数有一个应该影响程序行为的副作用. 为什么现在程序行为未定义?为什么不跳过副作用(因为没有调用析构函数)并且程
..
可能的重复: 内存泄漏是“未定义行为"吗?C++中的类问题? 永远不要对 new 或 new [] 返回的地址调用 delete 或 delete[]C++ 程序是未定义行为还是仅仅是内存泄漏? 欢迎参考标准(如果有). 这出现在这里的评论之一中.我只是对此有点困惑. 解决方案 [basic.life](3.8 对象生命周期)第4段讲: 程序可以通过重用对象占用的存储
..
我在阅读redis源代码时遇到了问题,谁能告诉我debug.c中_redisAssert函数中最后一条语句的用途是什么:> *((char*)-1) = 'x'; 解决方案 更新 我在 debug.c 在 OP 中提到,我们可以从这段代码上面的两行看到: redisLog(REDIS_WARNING,"(强制 SIGSEGV 打印错误报告.)"); 并且在 _redisPanic
..
这可能会让一些编码人员感到惊讶,尽管令人惊讶的是,如果没有编译器的非标准支持,就不可能实现 std::vector.问题本质上在于在原始存储区域上执行指针运算的能力.论文p0593:为低级对象操作隐式创建对象,出现在@ShafikYaghmour 回答中,清楚地揭示了针对存在的问题,提出对标准进行修改,以便于实现vector like container等法律级别的编程技术. 尽管如此,我想
..
事实证明,在 C++ 中,许多看起来很无辜的东西是未定义的行为.例如,一旦一个非空指针被delete甚至打印出该指针值是未定义的行为. 现在内存泄漏肯定很糟糕.但它们是什么阶级情况——定义的、未定义的或其他什么类别的行为? 解决方案 内存泄漏. 没有未定义的行为.泄漏内存是完全合法的. 未定义行为:是标准特别不想定义的操作,由实现决定,以便在不违反标准的情况下灵活地执行某
..
首先,根据 C++ 标准,对任何用 new[] 分配的东西使用 delete 是未定义的行为. 在 Visual C++ 7 中,这种配对会导致两种后果之一. 如果类型 new[]'ed 有简单的构造函数和析构函数 VC++ 简单地使用 new 而不是 new[] 并使用 delete该块工作正常 - new 只调用“分配内存",delete 只调用“空闲内存". 如果类型 ne
..
在块范围内考虑此代码: struct foo { unsigned char a;无符号字符 b;} x, y;x.a = 0;y = x; C [N1570] 6.3.2.1 2 说“如果左值指定了一个自动存储持续时间的对象,该对象可以用 register 存储类声明(从未获取其地址),并且对象未初始化(未使用初始化程序声明且在使用前未对其进行赋值),行为未定义." 虽然x的一个成员已
..
来自“Scott Meyers 撰写的《Effective C++ 3rd edition》": 为了强调未定义行为的结果是不可预测的,并且可能会非常不愉快,有经验的 C++ 程序员经常说具有未定义行为的程序会擦除您的硬盘驱动器. 在什么情况下会发生这种情况? 例如,访问和写入数组范围之外的位置是否会损坏不属于此 C++ 程序或线程的内存? 解决方案 可以吗?当然.事实上
..
我一定是疯了,但是我机器上的 gcc 4.7.3 给出了最荒谬的结果.这是我正在测试的确切代码: #include 使用命名空间标准;int main(){无符号整数 b = 100000;cout>= b;cout
..
GCC 6 有一个新的优化器功能:它假设 this始终不为 null 并基于此进行优化. 值范围传播现在假定 C++ 成员函数的 this 指针为非空.这消除了常见的空指针检查但也破坏了一些不符合规范的代码库(例如 Qt-5、Chromium、KDevelop).可以使用 -fno-delete-null-pointer-checks 作为临时解决方法.可以使用 -fsanitize=und
..
我有以下代码: #include #include 使用命名空间标准;int main() {复杂的三角洲;复杂的mc[4] = {0};for(int di = 0; di 我希望它输出“0, 1, 2, 3"并停止,但它输出了无休止的“0, 1, 2, 3, 4, 5, ....."系列 看起来比较 di 效果不佳,总是返回 true. 如果我只是注释掉 ,
..
以下代码在 GCC 上进入无限循环: #include 使用命名空间标准;int main(){int i = 0x10000000;int c = 0;做{C++;我 += 我;cout 0);cout
..
编译: #include int main(){for (int i = 0; i 和 gcc 产生以下警告: 警告:迭代 3u 调用未定义的行为 [-Waggressive-loop-optimizations]std::cout
..
我刚刚检查了 C++ 标准.似乎以下代码不应该是未定义行为: unsigned int val = 0x0FFFFFFF;无符号整数 res = val >>34;//res 应该是 0 C++ 标准,//但是 GCC 给出警告并且 res 是 67108863 来自标准: E1 >> E2 的值是 E1 右移的 E2 位位置.如果E1有一个无符号类型或者如果 E1 有一个有符号类型和一
..
我有点困惑.据我所知,如果你在 C 中声明一个 int,而不初始化它,例如:int x; 所以它的值是不确定的.所以如果我们尝试使用它或者应该有未定义的行为. 因此,如果我在 VS2010 中运行以下代码,它会使程序崩溃. int main(){一个;printf("%d\n",a);返回0;} 现在让我们看看下一个代码,它不提供任何警告并且不会崩溃(为什么?) void foo
..
Stroustrup 的 C++ 编程语言第 3 版说, 指针的减法只有在两个指针都指向时才定义同一个数组的元素(虽然语言没有快速的方法确保情况如此).当从另一个指针中减去一个指针时,结果是两个指针之间的数组元素数(一个整数).可以将一个整数加到一个指针上或减去一个来自指针的整数;在这两种情况下,结果都是一个指针值.如果该值不指向与原始指针或超出的指针,使用该值的结果是未定义. 例如:
..
编辑:原始单词选择令人困惑.“象征"一词比原来的(“神秘")好得多. 在关于我之前的 C++ 问题的讨论中,我被告知指针是 "一个很像的简单值类型一个整数" 不是“神秘的" "位模式(对象表示) 包含普通可复制类型的值(值表示)(第 3.9/4 节),这是一个指针." 这听起来不对!如果没有什么是象征性的并且指针是它的表示,那么我可以执行以下操作.我可以吗? #includ
..
根据 ISO C++,取消引用空指针是未定义的行为.我的好奇是,为什么?为什么标准决定将其声明为未定义行为?这个决定背后的理由是什么?编译器依赖?似乎没有,因为根据C99标准,据我所知,它是明确定义的.机器依赖?有什么想法吗? 解决方案 为取消引用 NULL 指针定义一致的行为将要求编译器在大多数 CPU 架构上的每次取消引用之前检查 NULL 指针.对于专为速度而设计的语言来说,这是一种
..