警告 C26472
請勿使用static_cast進行算術轉換。 使用大括弧初始化、
gsl::narrow_cast
或gsl::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)
};
}