是什么导致此代码仅在某些编译器上工作(UD?)?

时间:2015-04-28 16:07:44

标签: c compilation undefined-behavior

在我的代码中,我有这一行:

f(t->a, t->b, destroy(t));

其中f是函数,t是指向结构的指针,destroy是释放指针t并返回NULL的函数。代码在一些编译器(在OS X上的cc,gcc,clang和Linux上的clang)上成功编译并运行,如我所料 - t->at->b在释放t之前进行了评估。但是,当在Linux上使用cc / gcc进行编译时,我遇到了分段错误,就像我试图取消引用空指针一样。是什么导致的?

谢谢!

1 个答案:

答案 0 :(得分:4)

我们指定了函数调用的参数的评估顺序。 destroy(t)可以先评估,t将是免费的,因此t->a将调用未定义的行为。

C11:6.5.2.2函数调用(p12):

  

在函数调用中

(*pf[f1()]) (f2(), f3() + f4())
     

可以按任何顺序调用函数f1f2f3f4。 [...]