경고 C26411

'parameter' 매개 변수는 고유 포인터에 대한 참조이며 다시 할당하거나 다시 설정하거나 사용 T* 하거나 T& 대신 다시 설정하지 않습니다(r.33).

참조로 함수에 고유한 포인터를 전달하면 해당 리소스가 함수 내에서 해제되거나 전송될 수 있음을 의미합니다. 함수가 해당 매개 변수를 사용하여 리소스에 액세스하는 경우 원시 포인터 또는 참조를 전달하는 것이 안전합니다. 자세한 내용은 C++ 핵심 지침 규칙 R.33: unique_ptr<위젯>> 매개 변수를 사용하여 함수가 위젯을 재장착한다는 것을 나타냅니다.

설명

  • 경고 C26410 의 제한 사항도 여기에 적용됩니다.

  • 고유 포인터를 검색 release 하거나 reset 액세스하는 추론은 순진합니다. 대/소문자를 구분하지 않는 할당 연산자와 명명된 reset 함수에 대한 호출만 검색합니다. 물론 이 검색은 스마트 포인터 수정의 가능한 모든 사례를 다루지는 않습니다. 예를 들어 사용자 지정 스마트 포인터에서 특수한 비 함수const를 검색std::swap하지 않습니다. 이 경고는 사용자 지정 형식 및 표준 고유 포인터를 다루는 일부 시나리오에서 많은 가양성 결과를 생성할 수 있습니다. 스마트 포인터에 초점을 맞춘 더 많은 검사 구현함에 따라 추론이 개선될 것으로 기대합니다.

  • 스마트 포인터가 종종 템플릿이라는 사실은 흥미로운 제한 사항을 제공합니다. 컴파일러는 템플릿 코드를 사용하지 않는 경우 템플릿에서 처리할 필요가 없습니다. 스마트 포인터 인터페이스를 제한하여 사용하는 코드에서 검사 예기치 않은 결과를 생성할 수 있습니다. 일부 함수는 사용되지 않을 수 있으므로 검사er는 템플릿 형식의 의미 체계를 제대로 식별할 수 없습니다. 표준 std::unique_ptr의 경우 이 제한은 형식의 이름을 인식하여 완화됩니다. 이 분석은 더 잘 알려진 스마트 포인터를 다루기 위해 나중에 확장될 수 있습니다.

  • 암시적 참조로 캡처를 수행하는 람다 식은 고유한 포인터에 대한 참조에 대한 놀라운 경고로 이어질 수 있습니다. 현재 람다에서 캡처된 모든 참조 매개 변수는 재설정 여부에 관계없이 보고됩니다. 향후 릴리스에서는 추론을 확장하여 람다 필드와 람다 매개 변수의 상관 관계를 지정할 수 있습니다.

코드 분석 이름: NO_REF_TO_UNIQUE_PTR

예: 불필요한 참조

void TraceValid(std::unique_ptr<Slot> &slot)    // C26411
{
    if (!IsDamaged(slot.get()))
        std::cout << *slot.get();
}

void ReleaseValid(std::unique_ptr<Slot> &slot)  // OK
{
    if (!IsDamaged(slot.get()))
        slot.reset(nullptr);
}