lnt-arithmetic-overflow

算術式が、より幅の広い型に変換される前にオーバーフローする場合があります。

C および C++ で算術演算は、結果が割り当てられた型の幅ではなく、そのオペランドの最も幅の広い型を使用して評価されます。 結果がより幅の広い型に変換されることは、演算がオペランドのより幅の狭い型をオーバーフローする可能性を開発者が想定していることを示唆します。

lnt-arithmetic-overflow チェックは、C/C++ コード スタイル オプションの [算術オーバーフロー] 設定によって制御されています。 この設定を変更する方法については、リンターの構成に関する説明を参照してください。

#include <cstdint>

void overflow(int a, int b) {
    int64_t mul = a * b;      // Flagged: 32-bit operation may overflow.
    int64_t shift = a << 34;  // Flagged: Shift would overflow.

    int64_t mul2 = mul + b;   // OK: 'mul' is 64-bit so the addition expression is
                              // evaluated using 64-bit operations.
}

この問題を解決する方法

リンターは、オペランドの 1 つの幅を明示的に拡大する修正を提案します。 すると、次の例に示すように、式全体がより幅の広い結果型で評価されます。

void overflow(int a, int b) {
    int64_t mul = static_cast<int64_t>(a) * b;
    int64_t shift = static_cast<int64_t>(a) << 34;
}

こちらもご覧ください

C++ 用 IntelliSense コード リンターの概要