C28753

aviso C28753: Confiando em ordem indefinida de avaliação de parâmetros

C/C++ permite que o compilador gere código para avaliar parâmetros reais em qualquer ordem, e os compiladores x86 e Arm tendem a selecionar ordens diferentes. O código que depende de uma ordem específica pode se comportar de forma diferente em diferentes plataformas.

Um erro comum é com o uso de ponteiros inteligentes onde o endereço do operador & tem efeitos colaterais, em chamadas como esta:

sp->Foo(&sp);

As chamadas para o operador de acesso membro -> e operador & podem acontecer em qualquer ordem. Assim, os efeitos colaterais do operador & podem acontecer antes ou depois do operador -> é chamado. Este aviso encontra essas chamadas com bugs para evitar comportamentos diferentes entre plataformas.

Exemplo

O código a seguir exemplo gera esse aviso.

sp->Foo(&sp)

O exemplo de código a seguir evita esse aviso.

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