undefined-behavior相关内容
我要编写一个函数,该函数使用指针输入一个数据数组并输出另一个数据数组。 我想知道,如果src和dst都指向同一个地址,结果会是什么,因为我知道编译器可以针对const进行优化。它是不是未定义的行为?(我标记了C和C++,因为我不确定它们之间的答案是否会不同,我想知道两者的情况。) void f(const char *src, char *dst) { dst[2] = src
..
C++标准要求编译器在C++常量计算中检查未定义的行为。 在this talk中,Chandler Carruth指出,在检查UB时“您将耗尽检测错误的能力”,而且在一般情况下,检测UB与halting problem相关,因此可以证明无法确定。 他指的不是conexpr中的UB,但conexpr计算从C++14开始就像常规程序一样通用,因此这仍然适用。 那么,当编译器无法确定程
..
我正在为我的C++入门课的期末考试做准备。我们的教授给了我们这样一个练习题: 解释代码产生以下输出的原因:120 200 16 0 using namespace std; int main() { int x[] = {120, 200, 16}; for (int i = 0; i
..
这是C++中的有效函数: int f() { if(false) { return 42; } } 以下定义导致UB: int x = f(); // return value used 问题: 以下表达式语句是否导致UB? f(); 非常欢迎来自标准的报价。 推荐答案 C++03§6.6.3/2: 流出函数末尾相当于没
..
在C89标准中,我找到以下部分: 3.2.2.1 L值和功能指示符 除非它是sizeof运算符、一元&;运算符、++运算符、--运算符或的左操作数的操作数。运算符或赋值运算符,则不具有数组类型的左值将转换为存储在指定对象中的值(不再是左值)。如果左值具有限定类型,则该值具有左值类型的非限定版本;否则,该值具有左值类型。如果左值的类型不完整并且没有数组类型,则行为未定义。 如果我
..
C++20标准规定函数调用,7.6.1.3/8: 参数的初始化(包括每个关联值计算和副作用)相对于任何其他参数的初始化是不确定的。 不确定排序(相对于非排序)可确保影响相同内存区域的副作用不是未定义的行为。Cp首选项gives the following examples: f(i = -2, i = -2); // undefined behavior until C++17
..
我正在使用一些代码,通过将std::vector的地址与描述vector数据范围的地址进行比较,检查std::vector是否在固定时间内包含给定的元素。但是,我怀疑,尽管它可以工作,但它依赖于未定义的行为。如果vector不包含该元素,则不允许进行指针比较。 bool contains(const std::vector& v, const T& a) { return (v.d
..
这个问题可能有点争议。 我在块作用域中有以下代码: int *a = malloc(3 * sizeof(int)); if (!a) { ... error handling ... } a[0] = 0; a[1] = 1; a[2] = 2; 我认为这段代码调用ub是因为指针算法超出界限。 原因是a对象指针的有效类型永远不是 设置为int[3],但仅设置为int。因此,对索引处的对
..
C++20的严格的别名规则[basic.lval]/11是否任意允许... 在char*和char8_t*之间强制转换 string str = "string"; u8string u8str { (char8_t*) &*str.data() }; // c++20 u8string u8string u8str2 = u8"zß水🍌" string str2 { (char*
..
此处的用法与Using read() directly into a C++ std:vector相同,但有重新分配的帐户。 输入文件的大小未知,因此当文件大小超过缓冲区大小时,会通过加倍大小来重新分配缓冲区。以下是我的代码: #include #include #include int main() { const
..
乍一看,这个问题可能与 How检测整数溢出?,但实际上有很大不同. 我发现虽然检测无符号整数溢出非常简单,但在 C/C++ 中检测 有符号 溢出实际上比大多数人想象的要困难. 最明显但最幼稚的方法是: int add(int lhs, int rhs){整数总和 = lhs + rhs;if ((lhs >= 0 && sum
..
“未定义行为"的经典杜撰示例;当然是“鼻恶魔".— 物理上不可能,无论 C 和 C++ 标准允许什么. 因为 C 和 C++ 社区倾向于强调未定义行为的不可预测性以及允许编译器在遇到未定义行为时使程序按字面意思执行任何事情的想法,我曾假设该标准对未定义行为的行为没有任何限制. 但是C++ 标准中的相关引用似乎是: [C++14: defns.undefined]: [..] 允许
..
#include 诠释主要(无效){诠释 i = 0;i = i++ + ++i;printf("%d\n", i);//3我 = 1;我 = (i++);printf("%d\n", i);//2 应该是 1,不是吗?易失性int u = 0;u = u++ + ++u;printf("%d\n", u);//1你 = 1;u = (u++);printf("%d\n", u)
..
已更新,见下文! 我听说并读到 C++0x 允许编译器为以下代码段打印“Hello" #include int main() {而(1);std::cout
..
无符号整数溢出在 C 和 C++ 标准中都有很好的定义.例如,C99 标准(§6.2.5/9) 状态 涉及无符号操作数的计算永远不会溢出,因为不能用生成的无符号整数类型表示的结果是以比最大值大一的数字为模减少,可以是由结果类型表示. 但是,两个标准都规定有符号整数溢出是未定义的行为.同样,来自 C99 标准 (§3.4.3/1) 未定义行为的一个例子是整数溢出行为 这种差异
..
..
..
我在回答 问题 并制作了这个测试程序. #include 主函数(){易失性常量 int v = 5;int * a = &v;*a =4;printf("%d\n", v);返回0;} 如果没有 volatile 关键字,代码会优化(使用 -O3 apple clang 4.2 编译)var 的变化,它按预期工作并且 const 变量被正确修改. 我想知道一个更有经验
..
是否允许: const int const_array[] = { 42 };int maybe_inc(bool write, int* array) {如果(写)数组[0]++;返回数组[0];}int main() {return may_inc(false, const_cast(const_array));} 特别是,是否可以抛弃 const_array 的 const
..
这个代码是 UB 吗? 结构 A{无效非常量(){}};常量 A&a = A{};const_cast(a).nonconst(); 换句话说,(临时)对象最初是const吗?我浏览了标准,但找不到答案,因此希望能引用相关部分的内容. 编辑: 对于那些说 A{} 不是 const 的人,那么你能做到 A{}.nonconst() ? 解决方案 引用a的初始化由[dcl.i
..