경고 C26429

기호는 nullness에 대해 테스트되지 않으며 로 표시 gsl::not_null될 수 있습니다.

C++ 핵심 지침: F.23: a를 not_null<T> 사용하여 "null"이 유효한 값이 아님을 나타냅니다.

어설션을 사용하여 포인터 값의 유효성에 대한 가정을 적용하는 것이 일반적입니다. 문제는 어설션이 인터페이스(예: 반환 형식 또는 매개 변수)를 통해 가정을 노출하지 않는다는 것입니다. 어설션은 기본 다른 코드 변경 내용과 동기화를 유지하기도 어렵습니다. 지침 지원 라이브러리에서 null gsl::not_null 값이 없어야 하는 리소스를 표시하는 것이 좋습니다. USE_NOTNULL 규칙은 null에 대한 검사 생략하는 위치를 식별하는 데 도움이 되므로 사용하도록 gsl::not_null업데이트할 수 있습니다.

설명

규칙의 논리에는 null 검사(또는 null이 아닌 값 적용)가 정당화되도록 포인터 변수를 역참조하는 코드가 필요합니다. 따라서 포인터가 역참조되고 null에 대해 테스트되지 않은 경우에만 경고가 내보내집니다.

현재 구현은 일반 포인터(또는 해당 별칭)만 처리하며 스마트 포인터에도 적용할 수 있더라도 gsl::not_null 스마트 포인터를 검색하지 않습니다.

변수는 다음 컨텍스트에서 사용되는 경우 null에 대해 검사로 표시됩니다.

  • 분기 조건의 기호 식(예 if (p) { ... }: ;)입니다.
  • 비트가 아닌 논리 연산;
  • 하나의 피연산자는 0으로 계산되는 상수 식인 비교 연산입니다.

규칙에 전체 데이터 흐름 추적이 없습니다. 간접 검사 사용되는 경우(예: 중간 변수가 null 값을 보유하고 나중에 비교에 사용되는 경우) 잘못된 결과를 생성할 수 있습니다.

코드 분석 이름: USE_NOTNULL

예시

숨겨진 기대:

using client_collection = gsl::span<client*>;
// ...
void keep_alive(const connection *connection)   // C26429
{
    const client_collection clients = connection->get_clients();
    for (ptrdiff_t i = 0; i < clients.size(); i++)
    {
        auto client = clients[i];               // C26429
        client->send_heartbeat();
        // ...
    }
}

숨겨진 기대는 다음을 통해 gsl::not_null명확히 설명합니다.

using client_collection = gsl::span<gsl::not_null<client*>>;
// ...
void keep_alive(gsl::not_null<const connection*> connection)
{
    const client_collection clients = connection->get_clients();
    for (ptrdiff_t i = 0; i < clients.size(); i++)
    {
        auto client = clients[i];
        client->send_heartbeat();
        // ...
    }
}