경고 C26438
방지
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;
// ...
}
}