다음을 통해 공유


경고 C26448

최종 작업이 의도된 경우를 사용하는 gsl::finally 것이 좋습니다(gsl.util).

C++ 핵심 지침: GSL.util: 유틸리티

지침 지원 라이브러리는 최종 작업 개념을 구현하는 편리한 유틸리티를 제공합니다. C++ 언어는 try-finally 구문을 지원하지 않으므로 소멸 시 임의의 작업을 호출하는 사용자 지정 정리 형식을 구현하는 것이 일반적입니다. 이 gsl::finally 유틸리티는 이러한 방식으로 구현되며 코드 베이스에서 최종 작업을 수행하는 보다 균일한 방법을 제공합니다.

문(C26438 NO_GOTO 권장되지 않음)을 사용하여 goto 구식 C 스타일 방식으로 최종 작업을 수행하는 경우도 있습니다. 코드에서 많이 사용하는 goto정확한 의도를 감지하기는 어렵지만 일부 추론은 정리를 위한 더 나은 후보를 찾는 데 도움이 될 수 있습니다.

설명

  • 이 규칙은 경량이며 레이블 이름을 사용하여 최종 작업 개체를 사용할 기회를 추측합니다.
  • 경고를 발생시킬 수 있는 레이블 이름에는 "end", "final", "clean" 등의 단어가 포함됩니다.
  • 경고가 문에 goto 표시됩니다. 경우에 따라 자세한 출력을 볼 수 있지만 출력은 복잡성에 따라 코드의 우선 순위를 지정하는 데 도움이 될 수 있습니다.
  • 이 규칙은 항상 C26438 NO_GOTO 함께 적용합니다. 우선 순위에 따라 이러한 규칙 중 하나를 사용하지 않도록 설정할 수 있습니다.

코드 분석 이름: USE_GSL_FINALLY

예시

여러 goto 문을 사용하여 정리:

void poll(connection_info info)
{
    connection c = {};
    if (!c.open(info))
        return;

    while (c.wait())
    {
        connection::header h{};
        connection::signature s{};
        if (!c.read_header(h))
            goto end;               // C26448 and C26438
        if (!c.read_signature(s))
            goto end;               // C26448 and C26438
        // ...
    }

end:
    c.close();
}

다음으로 대체된 gsl::finally여러 goto 문을 사용하여 정리합니다.

void poll(connection_info info)
{
    connection c = {};
    if (!c.open(info))
        return;

    auto end = gsl::finally([&c] { c.close(); });
    while (c.wait())
    {
        connection::header h{};
        connection::signature s{};
        if (!c.read_header(h))
            return;
        if (!c.read_signature(s))
            return;
        // ...
    }
}