다음을 통해 공유


경고 C26430

기호는 모든 경로에서 null을 테스트하지 않습니다.

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

코드가 null에 대한 포인터 변수를 검사 경우 일관되게 수행하고 모든 경로에 대한 포인터의 유효성을 검사해야 합니다. 때로는 복잡한 분기 중 하나에서 하드 크래시가 발생할 가능성보다 null에 대한 과도 검사 더 나은 경우가 있습니다. 이상적으로 이러한 코드는 덜 복잡하고(여러 함수로 분할) 같은 표 gsl::not_null식에 의존하도록 리팩터링해야 합니다. 이러한 표식을 사용하면 코드가 유효한 포인터 값에 대해 안전한 가정을 할 수 있는 알고리즘의 일부를 격리할 수 있습니다. 이 규칙은 TEST_ON_ALL_PATHS null 검사 일치하지 않는 위치를 찾는 데 도움이 됩니다(가정이 검토가 필요할 수 있음). 또는 잠재적인 null 값이 일부 코드 경로에서 null 검사 무시할 수 있는 실제 버그를 찾습니다.

설명

이 규칙은 코드가 포인터 변수를 역참조하여 null 검사(또는 null이 아닌 값 적용)이 정당화될 것으로 예상합니다. 역참조가 없으면 규칙이 일시 중단됩니다.

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

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

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

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

암시적 null 검사 포인터 값이 다음에서 할당된 경우 가정됩니다.

  • throw를 사용하여 수행되는 할당입니다.operator new
  • 로 표시된 형식에서 가져온 포인터입니다 gsl::not_null.

예시

일관성 없는 테스트는 논리 오류를 표시합니다.

void merge_states(const state *left, const state *right) // C26430
{
    if (*left && *right)
        converge(left, right);
    else
    {
        // ...
        if (!left && !right)                            // Logic error!
            discard(left, right);
    }
}

일관성 없는 테스트는 논리 오류를 표시합니다. - 수정됨

void merge_states(gsl::not_null<const state *> left, gsl::not_null<const state *> right)
{
    if (*left && *right)
        converge(left, right);
    else
    {
        // ...
        if (*left && *right)
            discard(left, right);
    }
}