add restirction for unreachable and panic

This commit is contained in:
Heinz Gies 2019-10-11 13:58:56 +02:00 committed by Heinz N. Gies
parent ee6fc1bead
commit 8d911fe988
3 changed files with 59 additions and 4 deletions

View File

@ -25,6 +25,22 @@ declare_clippy_lint! {
"missing parameters in `panic!` calls" "missing parameters in `panic!` calls"
} }
declare_clippy_lint! {
/// **What it does:** Checks for usage of `panic!`.
///
/// **Why is this bad?** `panic!` will stop the execution of the executable
///
/// **Known problems:** None.
///
/// **Example:**
/// ```no_run
/// panic!("even with a good reason");
/// ```
pub PANIC,
restriction,
"missing parameters in `panic!` calls"
}
declare_clippy_lint! { declare_clippy_lint! {
/// **What it does:** Checks for usage of `unimplemented!`. /// **What it does:** Checks for usage of `unimplemented!`.
/// ///
@ -41,7 +57,23 @@ declare_clippy_lint! {
"`unimplemented!` should not be present in production code" "`unimplemented!` should not be present in production code"
} }
declare_lint_pass!(PanicUnimplemented => [PANIC_PARAMS, UNIMPLEMENTED]); declare_clippy_lint! {
/// **What it does:** Checks for usage of `unreachable!`.
///
/// **Why is this bad?** This macro can cause cause code to panics
///
/// **Known problems:** None.
///
/// **Example:**
/// ```no_run
/// unreachable!();
/// ```
pub UNREACHABLE,
restriction,
"`unreachable!` should not be present in production code"
}
declare_lint_pass!(PanicUnimplemented => [PANIC_PARAMS, UNIMPLEMENTED, UNREACHABLE]);
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for PanicUnimplemented { impl<'a, 'tcx> LateLintPass<'a, 'tcx> for PanicUnimplemented {
fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
@ -55,7 +87,15 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for PanicUnimplemented {
let span = get_outer_span(expr); let span = get_outer_span(expr);
span_lint(cx, UNIMPLEMENTED, span, span_lint(cx, UNIMPLEMENTED, span,
"`unimplemented` should not be present in production code"); "`unimplemented` should not be present in production code");
} else { } else if is_expn_of(expr.span, "unreachable").is_some() {
let span = get_outer_span(expr);
span_lint(cx, UNREACHABLE, span,
"`unreachable` should not be present in production code");
} else if is_expn_of(expr.span, "panic").is_some() {
let span = get_outer_span(expr);
span_lint(cx, PANIC, span,
"`panic` should not be present in production code");
//} else {
match_panic(params, expr, cx); match_panic(params, expr, cx);
} }
} }

View File

@ -1,4 +1,4 @@
#![warn(clippy::panic_params, clippy::unimplemented)] #![warn(clippy::panic_params, clippy::unimplemented, clippy::unreachable)]
#![allow(clippy::assertions_on_constants)] #![allow(clippy::assertions_on_constants)]
fn missing() { fn missing() {
if true { if true {
@ -56,6 +56,12 @@ fn unimplemented() {
let b = a + 2; let b = a + 2;
} }
fn unreachable() {
let a = 2;
unreachable!();
let b = a + 2;
}
fn main() { fn main() {
missing(); missing();
ok_single(); ok_single();
@ -65,4 +71,5 @@ fn main() {
ok_nomsg(); ok_nomsg();
ok_escaped(); ok_escaped();
unimplemented(); unimplemented();
unreachable();
} }

View File

@ -32,5 +32,13 @@ LL | unimplemented!();
| |
= note: `-D clippy::unimplemented` implied by `-D warnings` = note: `-D clippy::unimplemented` implied by `-D warnings`
error: aborting due to 5 previous errors error: `unreachable` should not be present in production code
--> $DIR/panic_unimplemented.rs:61:5
|
LL | unreachable!();
| ^^^^^^^^^^^^^^^
|
= note: `-D clippy::unreachable` implied by `-D warnings`
error: aborting due to 6 previous errors