경고 C26441

Guard 개체의 이름을 지정해야 합니다(cp.44)

C++ Core Guidelines

CP.44: 이름을 지정해야 합니다lock_guard.unique_lock

설명

표준 라이브러리는 수명 동안 리소스에 대한 동시 액세스를 제어하는 데 도움이 되는 잠금을 제공합니다. 이름 없이 잠금 개체를 선언하면 컴파일러는 바깥쪽 범위의 끝에 있는 개체가 아니라 즉시 소멸되는 임시 개체를 만듭니다. 따라서 변수에 잠금 개체를 할당하지 못하는 것은 임시 변수가 일시적이기 때문에 잠금 메커니즘을 효과적으로 사용하지 않도록 설정하는 실수입니다. 이 규칙은 이러한 의도하지 않은 동작의 간단한 사례를 catch합니다.

이 진단은 표준 잠금 유형 std::scoped_lockstd::unique_lockstd::lock_guard. 경고 C26444 는 명명되지 않은 다른 RAII 형식을 다룹니다.

분석기는 생성자에 대한 간단한 호출만 분석합니다. 더 복잡한 이니셜라이저 식은 누락된 경고의 형태로 부정확한 결과를 초래할 수 있습니다. 분석기는 함수 호출에 인수로 전달되거나 함수 호출에서 반환된 잠금을 무시합니다. 이러한 잠금이 의도적으로 해당 함수 호출을 보호하려고 하는지 또는 수 명을 연장해야 하는지 확인할 수 없습니다. 함수 호출에서 반환된 형식에 대해 유사한 보호를 제공하려면 주석을 클릭하여 주석을 추가 [[nodiscard]]합니다. 생성자에 [[nodiscard]] 주석을 추가하여 해당 형식의 명명되지 않은 개체를 방지할 수도 있습니다.

struct X { [[nodiscard]] X(); };

void f() {
    X{}; // warning C4834
}

분석기는 임시로 생성되었지만 명명된 참조에 할당된 잠금을 무시하여 수명을 연장합니다.

코드 분석 이름: NO_UNNAMED_GUARDS

예시

이 예제에서는 범위가 지정된 잠금의 이름이 없습니다.

void print_diagnostic(std::string_view text)
{
    auto stream = get_diagnostic_stream();
    if (stream)
    {
        std::lock_guard<std::mutex>{ diagnostic_mutex_ }; // C26441
        write_line(stream, text);
    }
}

오류를 해결하려면 잠금에 이름을 지정하여 수명을 연장합니다.

void print_diagnostic(std::string_view text)
{
    auto stream = get_diagnostic_stream();
    if (stream)
    {
        std::lock_guard<std::mutex> lock{ diagnostic_mutex_ };
        write_line(stream, text);
    }
}

참고 항목

C26444