次の方法で共有


警告 C26472

算術変換にはstatic_castを使用しないでください。 中かっこの初期化、 gsl::narrow_cast、または gsl::narrowを使用します。

C++ Core Guidelines: Type.1: キャストの回避

このルールは、整数型同士の変換に静的キャストが使用されている箇所を見つけるのに役立ちます。 これらのキャストは安全ではありません。データ損失が発生した場合、コンパイラは警告を表示しないためです。 定数が使用されている場合はかっこ初期化が適しており、コンパイラ エラーがあるのが理想です。 ガイドライン サポート ライブラリには、意図を明確に説明するのに役立つツールがあります。

  • gsl::narrow は、無損失変換を保証し、不可能な場合は 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)
    };
}