Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Избегайте
goto(es.76)
Основные рекомендации по C++
ES.76: Избегайте goto
Использование goto широко считается опасной и подверженной ошибкам практике. Это допустимо только в созданном коде, например в синтаксическом анализаторе, созданном из грамматики. Благодаря современным функциям и служебным программам C++, предоставляемым библиотекой поддержки рекомендаций, это должно быть легко избежать goto в целом.
Замечания
- Это правило предупреждает о любом вхождлении
goto, даже если это происходит в недоставленном коде, за исключением кода шаблона, который никогда не использовался и поэтому игнорируется компилятором. - Предупреждения могут умножаться, если макрос содержит
goto. Текущие механизмы отчетности указывают на все экземпляры, в которых развернут такой макрос. Его часто можно исправить в одном месте, изменив макрос или избегая его использования в пользу более обслуживаемых механизмов.
Имя анализа кода: NO_GOTO
Пример
"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();
}
"Goto clean-up" в макросе, заменен на 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;
// ...
}
}