다음을 통해 공유


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