undefined-behavior相关内容

如果更改 const 对象是未定义的行为,那么构造函数和析构函数如何通过写访问进行操作?

C++ 标准规定,修改最初声明为 const 的对象是未定义的行为.那么构造函数和析构函数是如何操作的呢? class 类 {上市:类(){更改();}〜类(){改变();}无效更改(){数据= 0;}私人的:整数数据;};//之后:常量类对象;//object.Change();- 不会编译const_cast( object ).Change();//编译,但它是未定义的行为 ..
发布时间:2022-01-23 23:46:28 C/C++开发

抛弃函数参数的常量是未定义的行为吗?

假设我有这个 C 函数(以及头文件中的相应原型) void clearstring(const char *data) {字符 *dst = (字符 *) 数据;*dst = 0;} 上述代码中是否存在未定义行为,将 const 丢弃,还是只是一种非常糟糕的编程习惯? 假设没有使用 const 限定的对象 字符名[] = "pmg";清除字符串(名称); 解决方案 尝试写入 *ds ..
发布时间:2022-01-23 23:30:53 其他开发

我们可以通过指针更改用 const 定义的对象的值吗?

#include 主函数(){常量 int a = 12;诠释* p;p = &a;*p = 70;} 会有用吗? 解决方案 这是“未定义的行为",这意味着根据标准,您无法预测尝试此操作时会发生什么.根据特定的机器、编译器和程序的状态,它可能会做不同的事情. 在这种情况下,最常见的情况是答案是“是".变量,无论是否为 const,只是内存中的一个位置,您可以打破 ..
发布时间:2022-01-23 23:01:19 其他开发

修改数组的一个元素而另一个线程修改同一数组的另一个元素是明确定义的行为吗?

给定一个 foo_t[n] 类型的数组和一组 n 个线程,其中每个 n 个线程读取并修改一个数组的不同元素,我是否需要显式同步数组的修改,或者我可以假设同时修改数组的成员是明确定义的行为?foo_t 有多大/它有什么对齐方式是否重要? 解决方案 我尝试做的是明确定义的行为. 参见 ISO/IEC 9899:2011 §5.1.2.4.27: 注意 13 将分配引入到可能不会被抽 ..
发布时间:2022-01-22 20:14:56 其他开发

在 bool 中设置额外的位使其同时为真和假

如果我得到一个 bool 变量并将其第二位设置为 1,则变量同时计算为真和假.使用带有 -g 选项的 gcc6.3 编译以下代码,(gcc-v6.3.0/Linux/RHEL6.0-2016-x86_64/bin/g++ -g main.cpp -omytest_d) 并运行可执行文件.你会得到以下结果. T怎么可能同时等于真假? 值位----- ----电话:1 0001位变化后电话: ..
发布时间:2022-01-19 17:10:33 C/C++开发

如果没有明确的“返回",函数将返回什么

我在忘记编写函数的return子句时遇到了这个问题,但是gcc中没有警告或错误.我修复了它,但开始想知道为什么函数会在没有 return 的情况下返回 meaningless 的东西.以下是我尝试过的一些示例: #include "stdio.h"#include “stdlib.h"int func1 () {诠释我;我 = 2;}int func2 (int a) {整数 i = a+3;} ..
发布时间:2022-01-19 15:16:32 其他开发

为什么返回对自动变量的引用有效?

我目前正在阅读有关 C++ 的内容,并且我读到在使用按引用返回时,我应该确保我没有返回对将超出范围的变量的引用函数返回. 那么为什么在 Add 函数中对象 cen 是通过引用返回的并且代码可以正常工作?! 代码如下: #include 使用命名空间标准;班级美分{私人的:诠释 m_nCents;上市:美分(int nCents){ m_nCents = nCent ..
发布时间:2022-01-19 15:14:30 C/C++开发

写前读未定义分配内存?

根据 此 reddit 评论线程,如果尝试在写入之前读取内存.我指的是已成功 malloced. 的普通堆内存 ...请注意,这不是严格有效的 C:允许编译器/运行时系统使用所谓的陷阱表示来初始化未初始化的内存,这会导致访问时出现未定义的行为. 我觉得这很难相信.有标准报价吗? 当然,我知道无法保证内存已清零.此未初始化内存中的值本质上是伪随机或任意的.但我真的不敢相信标准会将此称 ..
发布时间:2022-01-19 00:07:47 其他开发

读取不确定值未定义行为吗?

问题出现在问题答案的评论中 C/C++ bool 类型在类型转换为 int 时是否始终保证为 0 或 1? 有问题的代码分配 bool 的(本地)数组而不初始化它们的值. const int n = 100;布尔 b[n]; 显然 b 中的值是不确定的. 一些评论者认为阅读例如b[0] 是未定义的行为.这在 C++ 标准中的任何地方都有说明吗?我仍然相信相反的观点: 显然已经 ..
发布时间:2022-01-18 23:23:35 C/C++开发

为什么新变量的初始化本身是有效的?

考虑一些代码: #include 主函数(){使用 std::cout;诠释一个= 3;cout 我希望它打印出来 a=3新 a = 3改变 a = 5旧 a = 3 但实际上我得到的似乎是第二行中的 new a = 0 .我认为它会像类的构造函数中的初始化列表一样工作,可以像这样写 C::C(int a) : a(a) {} 但由于某种原因,情况有所不同.首先, ..

在初始化中使用新声明的变量(int x = x+1)?

我偶然发现了一个令我惊讶的行为: 写作时: int x = x+1; 在 C/C++ 程序(或涉及新创建的变量 x 的更复杂的表达式)中,我的 gcc/g++ 编译没有错误.在上述情况下,X 之后为 1.请注意,先前声明的范围内没有变量 x. 所以我想知道这是正确的行为(甚至在某些情况下可能有用)还是只是我的 gcc 版本或一般 gcc 的解析器特性. 顺便说一句:以下不起作 ..
发布时间:2022-01-18 23:15:43 C/C++开发

C++ 中未初始化的变量行为

我自己查了一下,我写了一个这样的程序 int main() {诠释我;cout 我运行了几次程序,结果一直都是一样的,为零.我在 C 中尝试过,结果是一样的. 但是我的教科书上说 如果您不初始化已定义的变量在函数内部,变量值保持未定义.这意味着元素承担以前驻留在内存中该位置的任何值. 当程序总是将空闲内存位置分配给变量时,这怎么可能?怎么可能不是零(我假设默认的可用内存值为 ..
发布时间:2022-01-18 23:10:43 C/C++开发

初始化是否需要左值到右值的转换?是`int x = x;` UB吗?

C++ 标准在 3.3.2,“声明点"中包含一个半著名的“令人惊讶的"名称查找示例: int x = x; 这会用自身初始化x,它(作为原始类型)是未初始化的,因此具有不确定的值(假设它是一个自动变量). 这实际上是未定义的行为吗? 根据 4.1“左值到右值的转换",对未初始化的值执行左值到右值的转换是未定义的行为.右手的 x 是否进行了这种转换?如果是这样,该示例实际上是否具有未 ..
发布时间:2022-01-18 23:09:14 C/C++开发

(为什么)使用未初始化的变量未定义的行为?

如果我有: 无符号整数 x;x -= x; 很明显 x 应该 在这个表达式之后为零,但是我到处看,他们说这个代码的 behavior 是未定义的,不仅仅是 x 的值(直到减法之前). 两个问题: 这段代码的行为是否确实未定义? (例如,代码可能会在兼容的系统上崩溃[或更糟]?) 如果是这样,为什么 C 会说 行为 是未定义的,而 x 非常清楚 这里应该为零? 即不在这 ..
发布时间:2022-01-18 23:05:37 其他开发

有趣的未初始化变量和编译器 (GCC)

C++ 标准的第 3.9.1/6 节说, bool 类型的值为 true 或 false. 现在考虑这段代码, void f(bool b){switch(b)//因为 b 是布尔值,它的值可以是真或假!{情况为真:cout ,例如 通过检查未初始化的自动对象,可能会导致它表现得好像它是非真非假. 所以无论我编译和运行这个程序多少次,我都会得到相同的输出:impossible va ..