C28753

avviso C28753: Basarsi su un ordine non definito di valutazione dei parametri

C/C++ consente al compilatore di generare codice per valutare i parametri effettivi in qualsiasi ordine e i compilatori x86 e Arm tendono a selezionare ordini diversi. Il codice che si basa su un ordine specifico può comportarsi in modo diverso su piattaforme diverse.

Un errore comune è con l'uso di puntatori intelligenti in cui l'indirizzo dell'operatore & ha effetti collaterali, nelle chiamate come segue:

sp->Foo(&sp);

Le chiamate all'operatore di accesso ai membri e> all'operatore&potrebbero verificarsi in entrambi gli ordini. Pertanto gli effetti collaterali dell'operatore & potrebbero verificarsi prima o dopo l'operatore -> viene chiamato. Questo avviso rileva queste chiamate buggy per impedire un comportamento diverso tra le piattaforme.

Esempio

L'esempio di codice seguente genera questo avviso.

sp->Foo(&sp)

Nell'esempio di codice seguente viene evitato questo avviso.

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