【问题标题】:Will the program encounter an undefined behavior? [duplicate]程序会遇到未定义的行为吗? [复制]
【发布时间】:2020-05-06 08:12:44
【问题描述】:

看下面的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) 
{
    int i = 2;
    srand(time(NULL));
    if (rand() % 2 == 0)
        i = i++ + 2;
    printf("%d", i);
}

现在,这个程序的输出有时是2,而有时是4——(现在,这个值4取决于编译器,并且在不同的编译器上值不同,前提是undefined statement i = i++ + 2; 被执行)——在这两种情况下都会发出警告。 因此,当我得到输出 2 时,编译器不会执行语句 i = i++ + 2;

那么我的程序在这种情况下是否也会遇到未定义的行为,即使由于编译器(在我的情况下为 GCC)发出警告而未执行该语句?

【问题讨论】:

  • 警告只是编译器发出的诊断消息,C 规范可能会也可能不会强制要求。但是来自编译器的警告消息并不意味着它不会尝试为程序生成代码,或者忽略它警告的内容。作为程序员,您有责任确保您传递给编译器的代码中没有 UB。
  • @Some 程序员老兄那么对于我得到输出 2 的情况,行为是否未定义?
  • @usr 这里的问题是这个问题中的代码与重复问题中的代码有很大不同,尤其是因为rand() 函数。如果代码实际上没有被执行,或者如果它被执行,则应单独查看。我们无法知道。这样一来,就不能提到代码没有被执行。可能有点具体,但有显着差异。
  • @RobertSsupportsMonicaCellio 有两种情况:何时采用分支,何时不采用。取分支时,显然是UB。所以问题是当分支没有被占用时它是否是UB,这就是欺骗中解决的问题。

标签: c compiler-warnings undefined-behavior


【解决方案1】:

未定义的行为发生在运行时,而不是在静态代码级别,如果这有意义的话。

如果你的程序中有一个有效路径和一个无效路径,就像你的例子一样,如果在任何时候它采用无效路径,程序的整个执行都是 UB。

因此,如果您从不执行无效语句,那么您已经定义了行为。


注意:我使用“无效代码”表示会导致 UB 的代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2019-12-12
    • 2018-05-03
    • 1970-01-01
    • 2014-08-11
    相关资源
    最近更新 更多