다음을 통해 공유


경고 C26473

원본 형식과 대상 형식이 동일한 포인터 형식 간에 캐스팅하지 마세요.

C++ 핵심 지침: Type.1: 캐스트 방지

이 규칙은 불필요하거나 의심스러운 캐스트를 제거하는 데 도움이 됩니다. 물론 형식이 자체적으로 변환되면 이러한 변환은 효과가 없습니다. 그러나 캐스트가 사용된다는 사실은 나중에 형식이 변경될 경우 미묘한 디자인 문제 또는 회귀 가능성을 나타낼 수 있습니다. 가능한 한 적은 수의 캐스트를 사용하는 것이 항상 안전합니다.

설명

  • 이 규칙은 정적 캐스트 및 재해석 캐스트에 대해 구현되며 포인터 형식만 확인합니다.

예시

위험하게 일반적인 조회

gsl::span<server> servers_;

template<class T>
server* resolve_server(T tag) noexcept {
    auto p = reinterpret_cast<server*>(tag); // C26473, also 26490 NO_REINTERPRET_CAST
    return p >= &(*servers_.begin()) && p < &(*servers_.end()) ? p : nullptr;
}

void promote(server *s, int index) noexcept {
    auto s0 = resolve_server(s);
    auto s1 = resolve_server(index);
   if (s0 && s1)
        std::swap(s0, s1);
}

위험하게 일반적인 조회 - 재작업됨

// ...
server* resolve_server(server *p) noexcept {
    return p >= &(*servers_.begin()) && p < &(*servers_.end()) ? p : nullptr;
}

server* resolve_server(ptrdiff_t i) noexcept {
    return !servers_.empty() && i >= 0 && i < servers_.size() ? &servers_[i] : nullptr;
}
// ...