警告 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)
};
}