경고 C26472
산술 변환에는 static_cast 사용하지 마세요. 중괄호 초기화
gsl::narrow_cast
사용 또는gsl::narrow
.
C++ 핵심 지침: Type.1: 캐스트 방지
이 규칙은 정적 캐스트를 사용하여 정적 형식 간을 변환하는 위치를 찾는 데 도움이 됩니다. 이러한 캐스트는 데이터 손실이 발생하는 경우 컴파일러가 경고하지 않기 때문에 안전하지 않습니다. 중괄호 이니셜라이저는 상수가 사용되고 컴파일러 오류가 필요한 경우에 더 적합합니다. 의도를 명확하게 설명하는 데 도움이 되는 지침 지원 라이브러리의 유틸리티도 있습니다.
gsl::narrow
는 무손실 변환을 보장하고 불가능한 경우 throw합니다gsl::narrowing_error
.gsl::narrow_cast
변환 시 데이터가 손실될 수 있으며 허용된다는 것을 명확하게 명시합니다.
설명
- 이 규칙은 정적 캐스트에 대해서만 구현됩니다. C 스타일 캐스트를 사용하는 것은 권장되지 않습니다.
코드 분석 이름: NO_CASTS_FOR_ARITHMETIC_CONVERSION
예시
처리되지 않은 예기치 않은 데이터:
rgb from_24bit(std::uint32_t v) noexcept {
return {
static_cast<std::uint8_t>(v >> 16), // C26472, what if top byte is non-zero?
static_cast<std::uint8_t>((v >> 8) & 0xFF), // C26472
static_cast<std::uint8_t>(v & 0xFF) // C26472
};
}
처리되지 않은 예기치 않은 데이터, 더 안전한 버전:
rgb from_24bit(std::uint32_t v) noexcept {
return {
gsl::narrow<std::uint8_t>(v >> 16),
gsl::narrow_cast<std::uint8_t>((v >> 8) & 0xFF),
gsl::narrow_cast<std::uint8_t>(v & 0xFF)
};
}