경고 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();
// ...
}
}