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
goto
uyarır. - Bir makro içerdiğinde
goto
uyarı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;
// ...
}
}