undefined-behavior相关内容

使用指向非常数的指针和指向相同地址的常量参数的指针的函数调用

我要编写一个函数,该函数使用指针输入一个数据数组并输出另一个数据数组。 我想知道,如果src和dst都指向同一个地址,结果会是什么,因为我知道编译器可以针对const进行优化。它是不是未定义的行为?(我标记了C和C++,因为我不确定它们之间的答案是否会不同,我想知道两者的情况。) void f(const char *src, char *dst) { dst[2] = src ..
发布时间:2022-09-20 20:48:10 C/C++开发

编译器如何知道C++常量计算不会触发未定义的行为?

C++标准要求编译器在C++常量计算中检查未定义的行为。 在this talk中,Chandler Carruth指出,在检查UB时“您将耗尽检测错误的能力”,而且在一般情况下,检测UB与halting problem相关,因此可以证明无法确定。 他指的不是conexpr中的UB,但conexpr计算从C++14开始就像常规程序一样通用,因此这仍然适用。 那么,当编译器无法确定程 ..
发布时间:2022-09-20 20:42:35 C/C++开发

在C语言中,是否有可能在语义上创建一个类型不完整的左值?

在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`的常量时间`?

我正在使用一些代码,通过将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/C++ 中检测有符号溢出

乍一看,这个问题可能与 How检测整数溢出?,但实际上有很大不同. 我发现虽然检测无符号整数溢出非常简单,但在 C/C++ 中检测 有符号 溢出实际上比大多数人想象的要困难. 最明显但最幼稚的方法是: int add(int lhs, int rhs){整数总和 = lhs + rhs;if ((lhs >= 0 && sum ..
发布时间:2022-01-31 10:29:55 C/C++开发

是否存在“未定义行为"?真的允许*任何事情*发生吗?

“未定义行为"的经典杜撰示例;当然是“鼻恶魔".— 物理上不可能,无论 C 和 C++ 标准允许什么. 因为 C 和 C++ 社区倾向于强调未定义行为的不可预测性以及允许编译器在遇到未定义行为时使程序按字面意思执行任何事情的想法,我曾假设该标准对未定义行为的行为没有任何限制. 但是C++ 标准中的相关引用似乎是: [C++14: defns.undefined]: [..] 允许 ..
发布时间:2022-01-31 09:34:41 C/C++开发

为什么定义了无符号整数溢出行为但没有定义有符号整数溢出?

无符号整数溢出在 C 和 C++ 标准中都有很好的定义.例如,C99 标准(§6.2.5/9) 状态 涉及无符号操作数的计算永远不会溢出,因为不能用生成的无符号整数类型表示的结果是以比最大值大一的数字为模减少,可以是由结果类型表示. 但是,两个标准都规定有符号整数溢出是未定义的行为.同样,来自 C99 标准 (§3.4.3/1) 未定义行为的一个例子是整数溢出行为 这种差异 ..
发布时间:2022-01-30 16:19:53 C/C++开发

使用 volatile 关键字修改 const 变量

我在回答 问题 并制作了这个测试程序. #include 主函数(){易失性常量 int v = 5;int * a = &v;*a =4;printf("%d\n", v);返回0;} 如果没有 volatile 关键字,代码会优化(使用 -O3 apple clang 4.2 编译)var 的变化,它按预期工作并且 const 变量被正确修改. 我想知道一个更有经验 ..
发布时间:2022-01-24 00:05:27 其他开发

临时对象最初是 const 吗?

这个代码是 UB 吗? 结构 A{无效非常量(){}};常量 A&a = A{};const_cast(a).nonconst(); 换句话说,(临时)对象最初是const吗?我浏览了标准,但找不到答案,因此希望能引用相关部分的内容. 编辑: 对于那些说 A{} 不是 const 的人,那么你能做到 A{}.nonconst() ? 解决方案 引用a的初始化由[dcl.i ..