Tag: undefined behavior

在同一个函数中,UB是否可以通过间接访问 – 一个不在范围内的局部变量?

在第二个闭合支撑之后, b只能通过间接通过a 。 int main() { int *a; { int b = 42; a = &b; } printf(“%d”, *a); // UB? return 0; } 由于b不再是范围,这是UB吗? 我知道从已经返回的函数中取消引用指向非静态局部变量的指针是UB,但在这种情况下,所有内容都在同一个函数中。 这是C ++中的UB,但我不确定C.

我什么时候可以逃脱未通过签名声明int?

在C中,应该使用关键字signed来声明像-1这样的有符号整数,如下所示: signed int i = -1; 但是,我试过这个: signed int i = -2; unsigned int i = -2; int i = -2; 所有3个案例用printf(“%d”, i);打印出-2 printf(“%d”, i); 。 为什么?

通过false循环跳过switch case是一种有效的操作?

这是合法代码还是违反任何规则? switch (expr) { do { case 6: /*…*/ if (/*…*/) break; case 7: /*…*/ } while (0); case 9: /*…*/ break; default: break; } 这是执行案例6的合法方式,然后是案例7,但只有在满足某些条件的情况下才会这样做吗? 或者这会导致未定义的行为并让鼻龙从交换机中出来? ps我的问题是指c99。 编辑: 我想要做的是:假设,案例9,必须在每个案例中执行。 如果expr是6,我必须执行6,在某些条件7和之后9或如果expr是7它的7-> 9所以我只想跳过7如果满足某些条件,但我不能改变6的顺序,7,9。 EDIT2: 我不是在寻找替代解决方案,我只是对这个片段的行为感兴趣。 如果switch语句在具有可变修改类型的标识符范围内具有关联的case或default标签,则整个switch语句应在该标识符的范围内。 来自ISO / IEC 9899:TC3 6.8.4.2-> 3 让我对它的行为不确定。 但我不确定那会像我的片段一样瞄准代码。

是使用未定义的任何不确定值还是仅存储在具有自动存储的对象中的值?

根据C99 J.2,在以下情况下行为未定义: 具有自动存储持续时间的对象的值在不确定时使用 那么对象具有不确定值的所有其他情况呢? 如果我们使用它们,我们是否也总是调用UB? 或者我们只在它们包含陷阱表示时调用UB? 例子包括: 使用malloc分配的对象的值(7.20.3.3p2) [存储在非自动存储器中]调用fclose后的FILE* (7.19.3p4) [存储在非自动存储器中]一个指针后free调用它(6.2.4p2) …等等。 我已将C99用于我的参考文献,但您可以在答案中自由引用C99或C11。

当b大于a中的位数时,右移(a >> b)的未定义行为?

显然,右移操作的行为: a >> b 当b >= sizeof(a)*CHAR_BIT时,在C和C ++中未定义(而在正常情况下,由于右移而从左侧引入的“新位”等于零)。 当b >= sizeof(a)*CHAR_BIT时,为什么这种未定义的行为比将结果设置为零更好?

为了打印“a”的值,内部的操作数(a + = 3,5,a)将如何处理或计算?

代码段是: int main() { int a = 1, b = 2, c = 3; printf(“%d”, a += (a += 3, 5, a)); } 虽然它在终端中显示8作为输出。 但我没有得到它背后的概念。

这是C / C ++中的未定义行为

int foo(int c){ return c; } int main(void){ int a=5,c; c = foo(–a) + a; } 它会在C / C ++中调用未定义的行为吗? 我想不,不会。 在阅读完所有答案之后,我无法弄清楚它是未定义的行为还是未指定的行为。

实现可以指定未定义的行为

3.4.1 1实现定义的行为 未指定的行为,其中每个实现记录了如何进行选择 实现是否可以指定,在未定义的行为是可能的结果的情况下,实现定义的行为是未定义的行为? 例如: 6.3.1.3有符号和无符号整数 3否则,新类型已签名且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号。 因此,只要记录在案,这个结果是否可以由实现未定义并导致未定义的行为,或者它必须具有该实现的定义结果?

如果程序的一部分表现出未定义的行为,它是否会影响程序的其余部分?

假设程序员忘记初始化他的一个自动变量,并且他使用了它的值,从而调用了未定义的行为。 … int i = 0, j; … printf(“value of ‘j’: %d\n”, j); … … char buf[256]; fputs(“Enter query:”, stdout); fgets(buf, sizeof(buf), stdin); … //process input … perform other tasks 程序员在屏幕上注意到乱码,并意识到他的程序是错误的,但它并没有崩溃,反正还在继续。 假设在此之后,程序提示用户输入并期望处理它,显示结果并执行所有独立于未初始化变量的其他任务,是程序员鼓励停止使用程序,修复错误,重新编译和运行? 该计划的其余部分是否会不一致?

无符号整数递增会导致未定义的定义行为吗?

在64位读取32位无符号乘法后导致未定义的行为? 问题在StackOverflow上,我开始思考根据C99标准,对小型无符号类型的典型算术运算是否会导致未定义的行为。 例如,请使用以下代码: #include … unsigned char x = UCHAR_MAX; unsigned char y = x + 1; x变量初始化为unsigned char数据类型的最大幅度。 下一行是问题:值x + 1大于UCHAR_MAX ,不能存储在unsigned char变量y 。 我相信以下是实际发生的事情。 变量x首先被提升为数据类型int (第6.3.1.1/2节),然后x + 1被计算为数据类型int 。 假设存在INT_MAX和UCHAR_MAX相同的实现 – x + 1将导致有符号整数溢出。 这是否意味着递增变量x ,尽管是无符号整数类型,由于可能的有符号整数溢出会导致未定义的行为?