Aracılığıyla paylaş


Uyarı C26438

Kaçının goto (es.76)

C++ Temel Yönergeleri:
ES.76: Goto'yu kullanmaktan kaçının

kullanımı goto yaygın olarak tehlikeli ve hataya eğilimli bir uygulama olarak kabul edilir. Yalnızca oluşturulan kodda kabul edilebilir, örneğin bir dil bilgisi tarafından oluşturulan ayrıştırıcıda. Yönergeler Destek Kitaplığı tarafından sağlanan modern C++ özellikleri ve yardımcı programları ile, tamamen kaçınmak goto kolay olmalıdır.

Açıklamalar

  • Bu kural, hiçbir zaman kullanılmayan ve derleyici tarafından yoksayılan şablon kodu dışında, geçersiz kodda gerçekleşse bile herhangi bir örneğinde gotouyarır.
  • Bir makro içerdiğinde gotouyarılar çarpabilir. Geçerli raporlama mekanizmaları, bu tür bir makroların genişletildiği tüm örnekleri işaret eder. Genellikle makro değiştirilerek veya daha sürdürülebilir mekanizmalar için kullanımından kaçınılarak tek bir yerde düzeltilebilir.

Kod analizi adı: NO_GOTO

Örnek

Makroda 'goto clean-up'

#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();
}

Makrodaki 'goto clean-up' yerine 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;
        // ...
    }
}