undefined-behavior相关内容

const 成员和赋值运算符.如何避免未定义的行为?

我回答了关于 我是否有未定义的行为 (UB)? 没有 UB 的解决方案是什么? 解决方案 您的代码导致未定义的行为. 不仅仅是“未定义,如果 A 用作基类,并且这个、那个或另一个".实际上未定义,总是.return *this 已经是 UB,因为 this 不能保证引用新对象. 具体来说,请考虑 3.8/7: 如果,在一个对象的生命周期之后已经结束并且在存储之 ..
发布时间:2021-11-30 12:29:31 C/C++开发

调用不带参数的 C 函数

关于 C 调用约定和 64/32 位编译之间可能未定义的行为,我有一些奇怪的问题.首先是我的代码: int f() { return 0;}int main(){整数 x = 42;返回 f(x);} 如您所见,我使用参数调用 f 而 f 不带参数.我的第一个问题是这个参数在调用它时是否真的给了 f. 神秘的线条 经过一点 objdump 后,我得到了奇怪的结果.将 x 作为 f ..
发布时间:2021-11-25 00:10:32 C#

是无符号字符 a[4][5];[1][7];未定义的行为?

C 标准读取 (J.2) 中未定义行为的示例之一: ——数组下标超出范围,即使对象显然可以通过给定下标(如左值表达式 a[1][7] 给定声明 inta[4][5]) (6.5.6) 如果声明从int a[4][5]改为unsigned char a[4][5],是否访问a[1][7] 仍然导致未定义的行为?我的观点是它没有,但我从其他人那里听到了不同意的声音,我想看看其他一些潜在的 ..
发布时间:2021-11-18 05:08:53 其他开发

为什么 C 不定义数组的最小大小?

C 标准定义了很多下限/上限(翻译限制) 并强加实现应满足每个翻译.为什么没有为数组大小定义这样的最小限制?以下程序将编译良好,可能会产生运行时错误/段错误,并会调用未定义的行为. int main(){int a[99999999];国际我;for(i=0;i 一个可能的原因可能是本地数组是在自动存储上分配的,这取决于分配的堆栈帧的大小.但是为什么不是像 C 定义的其他限制那样的最小限制? ..
发布时间:2021-11-18 04:31:57 其他开发

索引超过 C 数组的末尾

我用 C 编写了一个简短的程序,只是为了看看当索引超出数组末尾时会发生什么. 我发现它主要产生随机值(我知道它们实际上不是随机的),直到它每次产生 0 的点(在这种情况下超过末尾的 52 个索引).超过这一点的每个值都会导致程序崩溃.为什么是这样?是不是程序分配的内存空间结束了? main(){int ar[4];ar[0] = 99;ar[1] = 45;printf("数组: %d, ..
发布时间:2021-11-18 03:15:07 其他开发

二维数组索引 - 未定义的行为?

我最近使用了一些代码来执行一些有问题的二维数组索引操作.以以下代码示例为例: int a[5][5];[0][20] = 3;[-2][15] = 4;[5][-3] = 5; 上面的索引操作是否受到未定义行为的影响? 解决方案 这是未定义的行为,原因如下. 多维数组访问可以分解为一系列一维数组访问.换句话说,表达式a[i][j] 可以被认为是(a[i])[j].引用 C11 § ..
发布时间:2021-11-18 03:13:35 其他开发

将 T[][] 转换为 T*

将 T 类型的二维数组转换为 T* 并取消引用元素是否安全? 由于二维数组的内存布局是线性的,因此基指针应该等于指向第一个元素的指针.由于它们指向的最终类型也是相同的,所以应该没有任何对齐差异问题. 或者某些方面会导致未定义行为? 为了清楚起见,我的意思是这样的 - int arr[10][10];int p = *((int*) arr); 另外,如果我访问第一个数组之外的 ..
发布时间:2021-11-18 03:09:06 其他开发

C/C++:这是未定义的行为吗?(二维数组)

如果我以下列方式遍历二维数组的元素,这是未定义的行为吗? int v[5][5], i;for (i = 0; i 再说一次,它甚至可以编译吗?(我现在不能尝试,我不在家.)如果没有,那么想象一下我以某种方式获得了一个指向第一个元素的指针并使用 taht 而不是 v[i]. 解决方案 从指向第一个元素的指针访问多维数组的元素对于不属于第一个数组的元素是未定义行为 (UB). > ..
发布时间:2021-11-18 02:51:20 其他开发

在 C 和 C++ 中访问超出限制的数组

int 数据[8];数据[9] = 1; C++ 标准对此有何评论?这是未定义的行为吗? 至少 C 编译器 (gcc -std=c99 -pedantic -W -Wall) 对此没有任何说明. 解决方案 访问数组边界外是未定义行为,来自 c99 草案标准 部分 Annex J.2 J.2 未定义行为 包括以下几点: 数组下标超出范围,即使对象显然可以通过给定下标(如左值表达 ..
发布时间:2021-11-18 01:56:16 其他开发

我可以取数组的最后一个元素的地址吗?

可能的重复: 通过下标获取最后一个数组元素的地址:C++ 标准是否合法? int array[10];int* a = 数组 + 10;//明确定义int* b = &array[10];//没有把握... 最后一行是否有效? 解决方案 是的,您可以将地址移到数组末尾之外,但不能取消引用它.对于包含 10 个项目的数组, array+10 会起作用.&array[10] 是否真的会导 ..
发布时间:2021-11-18 01:40:30 其他开发

我可以将二维数组视为连续的一维数组吗?

考虑以下代码: int a[25][80];[0][1234] = 56;int* p = &a[0][0];p[1234] = 56; 第二行是否调用了未定义的行为?第四行呢? 解决方案 这取决于解释.虽然数组的连续性要求在如何布局多维数组方面没有太多想象空间(这在之前已经指出过),但请注意,当您执行 p[1234]您正在索引仅 80 列的第零行的第 1234 个元素.有些人将唯一有 ..
发布时间:2021-11-18 01:10:59 其他开发

为什么/如何 gcc 在这个有符号溢出测试中编译未定义的行为,以便它适用于 x86 而不是 ARM64?

我正在自学 CSAPP,在运行断言测试时遇到一个奇怪的问题,得到了一个奇怪的结果. 我不知道从什么开始这个问题,所以让我先获取代码(文件名在评论中可见): //文件:2.30.c//作者:iBugint tadd_ok(int x, int y) {如果 ((x ^ y) > > 31)返回 1;//一个正数和一个负整数相加总是没有问题的如果 (x 0)返回 (x + y) >y;//x ..
发布时间:2021-11-17 22:46:34 其他开发

在 C++17 中编译的 constexpr 从 int 到 unscoped enum 的未定义行为与非固定基础类型编译

这是constexpr 静态转换的未定义行为从 int 到作用域枚举在 C++17 中编译为非固定基础类型(作用域 枚举的相同问题).TLDR 是作用域枚举始终具有固定的基础类型(默认情况下为 int,因此您始终可以从 int 转换为作用域枚举). 我想知道以下内容是否应该在 C++17 中编译 enum E{甲、乙};constexpr Ex = static_cast(2); 这在 ..
发布时间:2021-09-13 20:42:03 其他开发

导致未定义行为的悬空引用

我曾在这里问过一个关于引用和未定义行为的上一个问题:上一个问题并基于给出的答案和一些评论中的评论,例如 user2079303 的评论,他们声明了这一点: 如果您有一个“主"容器,其中包含从不修改的对象本身(而不是引用),并且其他容器对主容器有引用,则引用包装器可以正常工作 我的新问题变成了这样:这是否有助于减轻可能导致未定义行为的悬空引用的可能性? template类包装{私人的: ..
发布时间:2021-09-13 20:42:00 其他开发

为什么不能用memcpy复制非POD对象?

根据我读过的各种资料,以下 C++ 代码调用了未定义的行为: class A {民众:虚空方法(){std::cout 方法(); 为什么这会导致未定义的行为?我看不到语言的逻辑实现,它不会像预期的那样运行(在两个对象具有相同运行时类型 ..
发布时间:2021-09-13 20:41:57 其他开发

为什么 rax 和 rdi 在这种情况下工作相同?

我已经制作了这个代码: 全局字符串;int strlen(const char *string);力量:异或 rcx, rcx重试:cmp 字节 [rdi + rcx], 0结果包括 rcxjmp重试结果:mov rax, rcx回复 这就是我测试它的方式: #include int main(int argc, char **argv){char* bob = argv[1];printf ..
发布时间:2021-09-13 20:41:53 其他开发

为什么 GCC 包含一个“空的"异或

我有以下一段代码: typedef struct {整数 x;输入 y;内部 z;国际w;} s32x4;s32x4F() {s32x4 v;v.x = 0返回 v;} 生成 (gcc -O2): f:异或 eax, eax异或 edx, edx ;这条线有问题回复 其中 clang 输出 (clang -O2): f: # @f异或 eax, eax回复 问题 GCC 在那里插 ..
发布时间:2021-09-13 20:41:50 其他开发

如何使用组成排序键的位域而不落入 UB?

假设我想要以下位域: struct SortingKey {uint8_t a: 2;uint8_t b: 4;uint8_t c: 2;} 要使用简单的整数比较,我可能需要将它包装成这样的联合并使用 value 进行排序: union UnionSortKey {SortingKey 键;uint8_t 值;} 然而,在 C++ 中,读取不活动的联合成员是未定义行为.如何保证不陷入UB而 ..
发布时间:2021-09-13 20:41:47 其他开发

是否使用 char 未定义行为访问数组元素?

由于不清楚什么是未定义行为,什么不是 C 语言,我想知道使用 char 访问数组元素是否是未定义行为.例如: char c = 'A';int a[3000];printf("%i\n", a[c]); 我知道实际上字符和整数在某种程度上是可以互换的,但我仍然不确定. 解决方案 是否使用 char 未定义行为访问数组元素? 这不是未定义的行为.它的工作方式类似于另一种整数类型 ..
发布时间:2021-09-13 20:41:44 其他开发