奇怪的参数传递 - 这样安全吗?

Joh*_*0te 4 c++ undefined-behavior

我正在研究一些遗留代码而且遇到了一些我不确定是否安全的东西 - 事实上我很确定它是未定义的,但我不完全确定为什么(或多或少是一种不好的感觉).

由于某种原因,这段代码有一个类,我们称之为A.类A有一个重载的预增量运算符(++),似乎对其中包含的指针的值进行一些操作(我们称之为指针B).

我找到了一个函数调用,其中用户传入A,并且在使用已经过载的预增量运算符时使用了指针B的解引用副本.

foo(++A, *B);
Run Code Online (Sandbox Code Playgroud)

由于A的预增量修改了B指向的值,并且B被解除引用并在同一个调用中用作参数...是否有问题或者我应该这样离开?

很抱歉,如果这听起来很混乱 - 代码太复杂而无法粘贴,但我尽力解释这种情况.如果需要,我会制作一些代表情况的假代码,但我希望它清楚.

另外,我知道这个代码的设计很难分别传入已包含在A中的参数,但我想了解除此之外是否存在实际问题.

Ker*_* SB 7

函数参数的评估顺序是未指定的,因此如果任一操作影响另一个操作的值,那么这确实是一个问题.

(但是在你的代码中,这会以某种方式要求B成为对成员的引用A.正如它所写的,人们不会怀疑可能存在问题(但你自己注意到了这一点).)

  • @Pubby:不.它并没有改变你有两个相对于彼此没有排序的评估这一事实. (2认同)

Beg*_*ner 5

进入函数之前计算参数的值.指定计算顺序.因此,您提供的代码可能会产生意外结果.你可以修复它

++A;
foo(A, *B)
Run Code Online (Sandbox Code Playgroud)

但是当然,正如你所说,如果B是A的一部分那么只有A应该通过.