算術式が、より幅の広い型に変換される前にオーバーフローする場合があります。
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;
}