경고 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);
}
}
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기