경고 C26411
'parameter' 매개 변수는 고유 포인터에 대한 참조이며 다시 할당하거나 다시 설정하거나 사용
T*
하거나T&
대신 다시 설정하지 않습니다(r.33).
참조로 함수에 고유한 포인터를 전달하면 해당 리소스가 함수 내에서 해제되거나 전송될 수 있음을 의미합니다. 함수가 해당 매개 변수를 사용하여 리소스에 액세스하는 경우 원시 포인터 또는 참조를 전달하는 것이 안전합니다. 자세한 내용은 C++ 핵심 지침 규칙 R.33: unique_ptr<위젯>> 매개 변수를 사용하여 함수가 위젯을 재장착한다는 것을 나타냅니다.
설명
경고 C26410 의 제한 사항도 여기에 적용됩니다.
고유 포인터를 검색
release
하거나reset
액세스하는 추론은 순진합니다. 대/소문자를 구분하지 않는 할당 연산자와 명명된reset
함수에 대한 호출만 검색합니다. 물론 이 검색은 스마트 포인터 수정의 가능한 모든 사례를 다루지는 않습니다. 예를 들어 사용자 지정 스마트 포인터에서 특수한 비 함수const
를 검색std::swap
하지 않습니다. 이 경고는 사용자 지정 형식 및 표준 고유 포인터를 다루는 일부 시나리오에서 많은 가양성 결과를 생성할 수 있습니다. 우리는 스마트 포인터에 초점을 맞춘 더 많은 검사를 구현함에 따라 추론을 향상시킬 것으로 기대합니다.스마트 포인터가 종종 템플릿이라는 사실은 흥미로운 제한 사항을 제공합니다. 컴파일러는 템플릿 코드를 사용하지 않는 경우 템플릿에서 처리할 필요가 없습니다. 스마트 포인터 인터페이스를 제한하여 사용하는 코드에서 검사기는 예기치 않은 결과를 생성할 수 있습니다. 일부 함수는 사용되지 않을 수 있으므로 검사기에서 템플릿 형식의 의미 체계를 제대로 식별할 수 없습니다. 표준
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);
}