경고 C26403
포인터 'variable'(r.3)을
owner<T>
다시 설정하거나 명시적으로 삭제합니다.
소유자 포인터는 고유한 포인터와 같습니다. 리소스를 독점적으로 소유하고 리소스 릴리스 또는 다른 소유자에게 전송을 관리합니다. 이 검사는 로컬 소유자 포인터가 함수의 모든 실행 경로를 통해 해당 리소스를 제대로 유지 관리하는지 확인합니다. 리소스가 다른 소유자에게 전송되지 않았거나 명시적으로 해제되지 않은 경우 검사기는 경고하고 포인터 변수의 선언을 가리킵니다.
자세한 내용은 C++ 핵심 지침을 참조 하세요.
설명
현재 이 검사는 리소스를 해제하지 못하는 정확한 경로를 제공하지 않습니다. 이 동작은 이후 릴리스에서 개선될 수 있습니다. 수정할 정확한 위치를 찾기 어려울 수 있습니다. 더 나은 방법은 복잡한 함수의 일반 포인터를 위험을 방지하기 위해 고유한 포인터로 바꾸는 것입니다.
이 검사는 코드 분석을 차단하지 않기 위해 지나치게 복잡한 함수를 삭제할 수 있습니다. 일반적으로 함수의 복잡성은 적절한 임계값으로 유지 관리되어야 합니다. 명확한 수요가 있는 경우 C++ Core Guidelines 모듈에 로컬 복잡성 검사를 추가하는 것이 좋습니다. 이 제한은 데이터 흐름에 중요한 다른 규칙에 적용됩니다.
포인터의 null 검사 후에만 메모리가 삭제되는 명확한 가양성 사례에서 경고가 발생할 수 있습니다. 이러한 가양성은 도구 API의 현재 제한 사항의 결과이지만 나중에 개선될 수 있습니다.
코드 분석 이름: RESET_OR_DELETE_OWNER
예시
오류 처리 중 정리 누락:
gsl::owner<int*> sequence = GetRandomSequence(); // C26403
try
{
StartSimulation(sequence);
}
catch (const std::exception& e)
{
if (KnownException(e))
return; // Skipping the path which deletes the owner.
ReportException(e);
}
delete [] sequence;