共用方式為


警告 C26472

請勿使用static_cast進行算術轉換。 使用大括弧初始化、 gsl::narrow_castgsl::narrow

C++ 核心指導方針 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)
    };
}