Skip to content

Commit

Permalink
Rollup merge of #5430 - michaelsproul:integer-arithmetic, r=flip1995
Browse files Browse the repository at this point in the history
Disallow bit-shifting in integer_arithmetic

Make the `integer_arithmetic` lint detect all the operations that are defined as being capable of overflow in the [Rust Reference](https://doc.rust-lang.org/reference/expressions/operator-expr.html#overflow), by also linting for bit-shifting operations (`<<`, `>>`).

changelog: Disallow bit-shifting in `integer_arithmetic`
  • Loading branch information
flip1995 authored Apr 15, 2020
2 parents ceea3c6 + 23df4a0 commit 2538e63
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 22 deletions.
18 changes: 11 additions & 7 deletions clippy_lints/src/arithmetic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,17 @@ use rustc_session::{declare_tool_lint, impl_lint_pass};
use rustc_span::source_map::Span;

declare_clippy_lint! {
/// **What it does:** Checks for plain integer arithmetic.
/// **What it does:** Checks for integer arithmetic operations which could overflow or panic.
///
/// **Why is this bad?** This is only checked against overflow in debug builds.
/// In some applications one wants explicitly checked, wrapping or saturating
/// arithmetic.
/// Specifically, checks for any operators (`+`, `-`, `*`, `<<`, etc) which are capable
/// of overflowing according to the [Rust
/// Reference](https://doc.rust-lang.org/reference/expressions/operator-expr.html#overflow),
/// or which can panic (`/`, `%`). No bounds analysis or sophisticated reasoning is
/// attempted.
///
/// **Why is this bad?** Integer overflow will trigger a panic in debug builds or will wrap in
/// release mode. Division by zero will cause a panic in either mode. In some applications one
/// wants explicitly checked, wrapping or saturating arithmetic.
///
/// **Known problems:** None.
///
Expand All @@ -21,7 +27,7 @@ declare_clippy_lint! {
/// ```
pub INTEGER_ARITHMETIC,
restriction,
"any integer arithmetic statement"
"any integer arithmetic expression which could overflow or panic"
}

declare_clippy_lint! {
Expand Down Expand Up @@ -71,8 +77,6 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Arithmetic {
| hir::BinOpKind::BitAnd
| hir::BinOpKind::BitOr
| hir::BinOpKind::BitXor
| hir::BinOpKind::Shl
| hir::BinOpKind::Shr
| hir::BinOpKind::Eq
| hir::BinOpKind::Lt
| hir::BinOpKind::Le
Expand Down
2 changes: 1 addition & 1 deletion src/lintlist/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -853,7 +853,7 @@ pub static ref ALL_LINTS: Vec<Lint> = vec![
Lint {
name: "integer_arithmetic",
group: "restriction",
desc: "any integer arithmetic statement",
desc: "any integer arithmetic expression which could overflow or panic",
deprecation: None,
module: "arithmetic",
},
Expand Down
10 changes: 4 additions & 6 deletions tests/ui/integer_arithmetic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ fn main() {
i / 2; // no error, this is part of the expression in the preceding line
i - 2 + 2 - i;
-i;
i >> 1;
i << 1;

// no error, overflows are checked by `overflowing_literals`
-1;
Expand All @@ -25,18 +27,16 @@ fn main() {
i & 1; // no wrapping
i | 1;
i ^ 1;
i >> 1;
i << 1;

i += 1;
i -= 1;
i *= 2;
i /= 2;
i %= 2;

// no errors
i <<= 3;
i >>= 2;

// no errors
i |= 1;
i &= 1;
i ^= i;
Expand Down Expand Up @@ -72,8 +72,6 @@ fn main() {
1 + 1
};
}


}

// warn on references as well! (#5328)
Expand Down
40 changes: 32 additions & 8 deletions tests/ui/integer_arithmetic.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,18 @@ error: integer arithmetic detected
LL | -i;
| ^^

error: integer arithmetic detected
--> $DIR/integer_arithmetic.rs:20:5
|
LL | i >> 1;
| ^^^^^^

error: integer arithmetic detected
--> $DIR/integer_arithmetic.rs:21:5
|
LL | i << 1;
| ^^^^^^

error: integer arithmetic detected
--> $DIR/integer_arithmetic.rs:31:5
|
Expand Down Expand Up @@ -62,46 +74,58 @@ LL | i %= 2;
| ^^^^^^

error: integer arithmetic detected
--> $DIR/integer_arithmetic.rs:81:5
--> $DIR/integer_arithmetic.rs:36:5
|
LL | i <<= 3;
| ^^^^^^^

error: integer arithmetic detected
--> $DIR/integer_arithmetic.rs:37:5
|
LL | i >>= 2;
| ^^^^^^^

error: integer arithmetic detected
--> $DIR/integer_arithmetic.rs:79:5
|
LL | 3 + &1;
| ^^^^^^

error: integer arithmetic detected
--> $DIR/integer_arithmetic.rs:82:5
--> $DIR/integer_arithmetic.rs:80:5
|
LL | &3 + 1;
| ^^^^^^

error: integer arithmetic detected
--> $DIR/integer_arithmetic.rs:83:5
--> $DIR/integer_arithmetic.rs:81:5
|
LL | &3 + &1;
| ^^^^^^^

error: integer arithmetic detected
--> $DIR/integer_arithmetic.rs:88:5
--> $DIR/integer_arithmetic.rs:86:5
|
LL | a + x
| ^^^^^

error: integer arithmetic detected
--> $DIR/integer_arithmetic.rs:92:5
--> $DIR/integer_arithmetic.rs:90:5
|
LL | x + y
| ^^^^^

error: integer arithmetic detected
--> $DIR/integer_arithmetic.rs:96:5
--> $DIR/integer_arithmetic.rs:94:5
|
LL | x + y
| ^^^^^

error: integer arithmetic detected
--> $DIR/integer_arithmetic.rs:100:5
--> $DIR/integer_arithmetic.rs:98:5
|
LL | (&x + &y)
| ^^^^^^^^^

error: aborting due to 17 previous errors
error: aborting due to 21 previous errors

0 comments on commit 2538e63

Please sign in to comment.