경고 C26438

방지 goto (es.76)

C++ 핵심 지침:
ES.76: goto 방지

사용 goto 은 위험하고 오류가 발생하기 쉬운 관행으로 널리 간주됩니다. 문법에서 생성된 파서와 같이 생성된 코드에서만 허용됩니다. 지침 지원 라이브러리에서 제공하는 최신 C++ 기능 및 유틸리티를 사용하면 쉽게 방지 goto 할 수 있습니다.

설명

  • 이 규칙은 사용되지 않으며 컴파일러에서 무시되는 템플릿 코드를 제외하고 데드 코드에서 발생하는 경우에도 모든 발생 goto에 대해 경고합니다.
  • 매크로에 경고가 포함되면 경고가 곱할 수 있습니다.goto 현재 보고 메커니즘은 이러한 매크로가 확장되는 모든 인스턴스를 가리킵니다. 매크로를 변경하거나 더 기본 달성 가능한 메커니즘을 위해 매크로를 사용하지 않도록 한 곳에서 수정할 수 있습니다.

코드 분석 이름: NO_GOTO

예시

매크로의 'goto 클린-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 클린-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;
        // ...
    }
}