undefined-behavior相关内容

赋值语句中右边的增量表达式是按什么顺序计算的?它是未定义的吗?

我最近了解了 C 中的未定义行为,但此特定代码在站点中用作“逗号作为运算符"的示例,虽然我了解第 2 行中 y = x++ 的方式,但我不明白按什么顺序计算第 2 行中的子表达式.我认为这是未定义的行为,但我不确定,因为该网站没有提及任何此类内容. int main(){整数 x = 10, y;y = (x++, printf("x = %d\n", x), ++x, printf("x = ..
发布时间:2021-09-13 20:39:38 其他开发

以未指定的顺序使用具有副作用的函数是否是未定义的行为?

我知道诸如 x = x++ + ++x 之类的东西会调用未定义的行为,因为变量在同一序列点内被多次修改.这在这篇博文中进行了彻底的解释为什么这些结构使用前置和后置增量未定义行为? 但是考虑像 printf(“foo") + printf(“bar") 这样的东西.函数 printf 返回一个 int,因此表达式在这个意义上是有效的.但是+运算符的计算顺序在标准中没有规定,所以不清楚这会打印f ..
发布时间:2021-09-13 20:39:31 其他开发

关于未定义行为

通常,UB 被认为是必须避免的东西,当前的 C 标准本身在附录 J 中列出了很多示例. 但是,在某些情况下,除了牺牲可移植性外,我认为利用 UB 没有任何害处. 考虑以下定义: int a = INT_MAX + 1; 评估这个表达式会导致 UB.但是,如果我的程序打算在 32 位 CPU 上运行,该 CPU 使用模算术表示二进制补码中的值,我倾向于相信我可以预测结果. 在我 ..
发布时间:2021-09-13 20:39:28 其他开发

在 C++ 中,用自身初始化全局变量是否具有未定义的行为?

int i = i;int main() {int a = a;返回0;} int a = a 肯定有未定义的行为(UB),更多细节在正在阅读未初始化的值总是未定义的行为?或者有例外吗?. 但是 int i = i 呢?在 C++ 中,我们可以为全局变量分配非常量值.i 在遇到声明之前被声明和零初始化(因为它具有文件范围).在这种情况下,我们稍后在定义中将 0 分配给它.可以说这没有 UB ..
发布时间:2021-09-13 20:39:25 C/C++开发

未经验证的 scanf 调用会导致未定义的行为吗?

如果出现错误,以下代码段是否会调用未定义的行为? #include int main() {国际我;/* 不确定 */if (scanf("%d", &i) == 1)/* 初始化 */printf("%d\n", i);/* 成功!打印读取值 */别的printf("%d\n", i);/* 输入失败!是否打印`i` UB?*/返回0;} 如果 scanf 失败,是否访问了未初始化的变量? ..
发布时间:2021-09-13 20:39:22 其他开发

如果分配了该区域,则访问超出其末尾的数组是否是未定义的行为?

可能的重复: 是“struct hack"吗?技术上未定义的行为? 通常在数组末尾访问数组是 C 中未定义的行为.例如: int foo[1];foo[5] = 1;//未定义的行为 如果我知道数组末尾之后的内存区域已经分配,​​使用 malloc 还是在堆栈上,它仍然是未定义的行为吗?下面是一个例子: #include #include 类型定义结构{内里;整数数据[1];我的结构 ..
发布时间:2021-09-13 20:39:16 其他开发

通过指针算法访问结构数据成员

如果我有一个像这样的简单张量类 struct 张量{双 XX、XY、XZ;双 YX, YY, YZ;双ZX、ZY、ZZ;} 使用指针算术(见下文)访问其元素是否是未定义的行为? double&Tensor::operator[](int i){断言(i 解决方案 是的,这是未定义的行为. 数据成员不在数组中,因此不能保证在连续内存中背靠背存储,因为指针运算需要.它们之间可能会产 ..
发布时间:2021-09-13 20:39:13 C/C++开发

未初始化变量的默认值

我正在阅读本教程关于调试.我将阶乘代码粘贴到我的 .c 存档中: #include int main(){int i, num, j;printf("请输入数字:");scanf ("%d", &num );for (i=1; i 当我运行可执行文件时,它总是打印 0,但是,教程的作者说它返回数字垃圾值.我在谷歌上搜索过这个,我读到这是正确的,除了静态变量.所以它应该返回一个垃圾号而不是 0. ..
发布时间:2021-09-13 20:39:05 其他开发

为什么在 C 中允许未定义的行为

我最近一直在努力学习 C.来自 Java,令我惊讶的是您可以执行声明为“未定义"的某些操作. 这对我来说似乎非常不安全.我知道程序员有责任不执行未定义的操作,但为什么甚至允许它开始呢?例如,为什么编译器没有捕捉到数组索引越界,甚至是悬空指针?您最终只是访问了本不应该访问的内存块,而没有(明显的)充分理由. 相比之下,Java 使更加确定你不会做任何事情愚蠢,像热蛋糕一样抛出异常. ..
发布时间:2021-09-13 20:39:02 其他开发

ctype.h 还需要无符号字符吗?

传统上,严格来说,将 signed char 传递给 ctype.h 谓词是一个错误,因为它们只定义为 -1 到 255,所以-128 到 -2 最终可能会读取数组边界之外的内容. 这是否曾经修复过,还是严格来说您仍然必须使用 unsigned char 来避免现代版本的 C 中的未定义行为? 解决方案 严格来说,您是否仍然必须使用 unsigned char 来避免现代版本的 ..
发布时间:2021-09-13 20:39:00 其他开发

C - 函数返回指向局部变量的指针

考虑以下代码. #includeint *abc();//这个函数返回一个int类型的指针int main(){int *ptr;ptr = abc();printf("%d", *ptr);返回0;}int *abc(){int i = 45500,*p;p = &i;返回 p;} 输出: 45500 我知道根据 link 这种类型的行为是未定义的.但是为什么我每次运行程序时都会 ..
发布时间:2021-09-13 20:38:55 其他开发

什么是 C 中的未定义行为?

什么是 C 中的未定义行为? 我正在使用 GCC 编译器.在某些情况下,虽然程序的输出应该是未定义的,但我得到了正确的值.我多次运行这些程序.但结果是一致的.对于其他一些程序,结果是不确定的.那么,在哪些情况下我应该考虑程序行为真的是未定义的?这有什么规则吗? 解决方案 未定义行为的定义: C11(ISO/IEC 9899:201x) §3.4.3 1 个未定义的行为 ..
发布时间:2021-09-13 20:38:52 其他开发

从函数和未定义的行为返回局部初始化的结构

(部分初始化我的意思是定义为未初始化,并且它的一个成员被设置为一些有效值,但不是全部.本地我的意思是定义为自动存储持续时间.这个问题只讨论那些.) 使用可以用寄存器定义的自动未初始化变量,因为右值是未定义的行为.可以使用寄存器存储类说明符定义结构. 6.3.2.1 如果左值指定一个自动存储持续时间的对象,该对象可能已经使用 register 存储类声明(从未获取其地址),并且该对 ..
发布时间:2021-08-31 19:09:39 其他开发

为什么在使用静态方法时取消引用 nullptr 而不是 C++ 中的未定义行为?

我正在阅读 一篇关于 C++ 中一些 nullptr 特性的帖子,一个特定的例子在我的理解中引起了一些混乱. 考虑(上述帖子中的简化示例): struct A {void non_static_mem_fn() {}static void static_mem_fn() {}};A* p{nullptr};/*1*/*p;/*6*/p->non_static_mem_fn();/*7*/p ..

在 T 和 UnsafeCell T 之间转换是否安全和定义行为?

一个最近的问题正在寻找构建自我参照结构的能力.在讨论该问题的可能答案时,一个可能的答案涉及使用 UnsafeCell 用于内部可变性,然后通过 {:?}", v.value, v.myself.upgrade().map(|v| v.value))} 此代码似乎打印出我所期望的内容,但这并不意味着它是安全的或使用了已定义的语义. 从 UnsafeCell 转换为 T 内存安全吗?它会调 ..
发布时间:2021-07-13 21:13:29 其他开发

Rust 中的严格别名?

我的理解是,由于所谓的“严格别名规则",以下代码在 C++ 中有未定义的行为. #include 枚举 Foo : int16_t {};无效测试(Foo& foo){reinterpret_cast(foo) = 42;} 特别是,C++ 编译器可能会完全省略赋值,因为它允许假设 reinterpret_cast 返回的 int16_t& 不指向相同的内存作为 foo(属于 ..
发布时间:2021-07-13 21:13:06 其他开发

在 NULL 值(或未定义)指针上重新分配

我正在阅读 realloc 并得到对那里提到的一点感到困惑.考虑下面的代码: #include #include int主(){int* ptr = NULL;ptr = realloc(ptr, 10*sizeof(int));返回0;} 使用初始 NULL 值的 ptr 使用 realloc 分配内存是否有任何危险?如果不是: int* ptr = NULL; 我有这个: int* ..
发布时间:2021-07-05 18:46:15 其他开发