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