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