代码之家  ›  专栏  ›  技术社区  ›  sharptooth

是否允许C++编译器在遇到一个被定义为未定义行为的结构时发出随机代码?[副本]

  •  0
  • sharptooth  · 技术社区  · 14 年前

    可能重复:
    Undefined, unspecified and implementation-defined behavior

    我试图加深对C++中未定义行为的理解。假设C++编译器将有意地检测某些未定义行为的情况,例如, modifying the variable twice between two sequence points :

    x++ = 2;
    

    一旦那个虚构的编译器可靠地检测到这种情况,它就会说 向生成的机器代码中发出10条完全随机的机器指令 .

    根据C++标准, wherever something is classified as UB there're no requirements on what happens . 所描述的虚拟编译器是否符合C++标准?

    4 回复  |  直到 7 年前
        1
  •  9
  •   Matthew Flaschen    14 年前

    对。标准规定 要求,所以它可以做任何它想做的:

    未定义的行为

    行为,如使用 错误的程序构造或 错误的数据,为此 国际标准没有规定 要求。

    正如一个注释,这是一个未定义的行为,但它不一定是一个好的例子。在g++4.4.1上,它将拒绝使用以下命令进行编译:

    错误:左操作数需要左值 转让

    因为post增量的结果不是左值。

        2
  •  3
  •   MSalters    14 年前

    基本上,是的,如果并且只有当这10条指令是同样可到达的。请考虑以下代码:

    int main () {
      if (false) {
        int x = 0; x++ = 2;
      }
      std::cout << "Hello, world" << std::endl;
    }
    

    UB可以在编译时被检测到,并且该特定分支的代码生成可能导致无意义的代码。但是,不具备条件的跳转必须跳过所有这些并直接跳过结束语 }

    (这个问题不是重复的,因为前面没有讨论运行时UB的编译时检测)

        3
  •  2
  •   JP19JP19    14 年前

    一个特定的编译器(除非有错误)在遇到这样的结构时总是有相同的行为(绝对没有随机代码)(除非代码的上下文不同)。

    实际上,“未定义的行为”意味着“不同的编译器处理事情的方式不同”。

    如果你想知道“你的虚拟编译器仍然符合C++标准吗?”-我想答案是肯定的。

        4
  •  0
  •   Tony Delroy    14 年前

    从标准草案/ http://www.kuzbass.ru:8086/docs/isocpp/intro.html /[1.3.12]

    [注:允许的未定义行为范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式(无论是否发出诊断消息)的行为,终止翻译或执行(发出诊断信息)。许多错误的程序构造不会产生未定义的行为;它们需要被诊断。]

    当然没有列出插入随机指令,而且很难说“ranges from”方面将包括插入随机指令的决定,因为随机指令位于列出的行为之间的连续统中的任何位置。;-)