Aviso C26438

Evitar goto (es.76)

Diretrizes Principais do C++:
ES.76: Evitar goto

O uso de goto é uma prática consideravelmente perigosa e propensa a erros. É aceitável apenas em código gerado, como em um analisador gerado com base em uma gramática. Com os recursos e utilitários modernos do C++ fornecidos pela Biblioteca de Suporte de Diretrizes, é fácil evitar completamente o uso de goto.

Comentários

  • Esta regra avisa sobre qualquer ocorrência de , mesmo que aconteça em código morto, exceto código de gotomodelo que nunca é usado e, portanto, é ignorado pelo compilador.
  • Os avisos podem se multiplicar quando uma macro contém goto. Os mecanismos de relatório atuais apontam para todas as instâncias em que essa macro é expandida. Muitas vezes, isso pode ser corrigido em um só local, alterando a macro, ou evitando seu uso para dar lugar a mecanismos mais fáceis de manter.

Nome da análise de código: NO_GOTO

Exemplo

'goto clean-up' na macro

#define ENSURE(E, L) if (!(E)) goto L;

void poll(connection &c)
{
    ENSURE(c.open(), end);                  // C26438

    while (c.wait())
    {
        connection::header h{};
        connection::signature s{};
        ENSURE(c.read_header(h), end);      // C26438
        ENSURE(c.read_signature(s), end);   // C26438
        // ...
    }

end:
    c.close();
}

'goto clean-up' na macro, substituído por gsl::finally

void poll(connection &c)
{
    auto end = gsl::finally([&c] { c.close(); });

    if (!c.open())
        return;

    while (c.wait())
    {
        connection::header h{};
        connection::signature s{};
        if(!c.read_header(h))
            return;
       if(!c.read_signature(s))
            return;
        // ...
    }
}