Joh*_*0te 4 c++ undefined-behavior
我正在研究一些遗留代码而且遇到了一些我不确定是否安全的东西 - 事实上我很确定它是未定义的,但我不完全确定为什么(或多或少是一种不好的感觉).
由于某种原因,这段代码有一个类,我们称之为A.类A有一个重载的预增量运算符(++),似乎对其中包含的指针的值进行一些操作(我们称之为指针B).
我找到了一个函数调用,其中用户传入A,并且在使用已经过载的预增量运算符时使用了指针B的解引用副本.
foo(++A, *B);
Run Code Online (Sandbox Code Playgroud)
由于A的预增量修改了B指向的值,并且B被解除引用并在同一个调用中用作参数...是否有问题或者我应该这样离开?
很抱歉,如果这听起来很混乱 - 代码太复杂而无法粘贴,但我尽力解释这种情况.如果需要,我会制作一些代表情况的假代码,但我希望它清楚.
另外,我知道这个代码的设计很难分别传入已包含在A中的参数,但我想了解除此之外是否存在实际问题.
函数参数的评估顺序是未指定的,因此如果任一操作影响另一个操作的值,那么这确实是一个问题.
(但是在你的代码中,这会以某种方式要求B成为对成员的引用A.正如它所写的,人们不会怀疑可能存在问题(但你自己注意到了这一点).)
在进入函数之前计算参数的值.未指定计算顺序.因此,您提供的代码可能会产生意外结果.你可以修复它
++A;
foo(A, *B)
Run Code Online (Sandbox Code Playgroud)
但是当然,正如你所说,如果B是A的一部分那么只有A应该通过.
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |