C28753

警告 C28753:依赖于未定义的参数计算顺序

C/C++ 允许编译器生成代码以任何顺序评估实际参数,并且 x86 和 Arm 编译器倾向于选择不同的顺序。 依赖于特定顺序的代码在不同平台上的行为可能会有所不同。

一个常见的错误是使用智能指针,其中地址运算符 & 有副作用,在如下调用中:

sp->Foo(&sp);

对成员访问运算符 -> 和运算符 & 的调用可能按任一顺序发生。 因此,运算符 & 的副作用可能发生在运算符 -> 调用之前或之后。 此警告查找这些 bug 的调用,以防止平台之间的不同行为。

示例

以下示例中的代码生成此警告。

sp->Foo(&sp)

下面的代码示例避免了此警告。

SmartPtr spTemp;
sp->Foo(&spTemp);
sp = spTemp;