From bae129ac692f33998094eaa73edb977df66b854d Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 3 Feb 2020 10:42:21 +0900 Subject: [PATCH] Use `checked_sub` to avoid index out of bounds --- clippy_lints/src/misc_early.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/clippy_lints/src/misc_early.rs b/clippy_lints/src/misc_early.rs index 4629a53025c..6f54750cb9b 100644 --- a/clippy_lints/src/misc_early.rs +++ b/clippy_lints/src/misc_early.rs @@ -488,7 +488,11 @@ impl MiscEarlyLints { LitIntType::Unsuffixed => "", }; - let maybe_last_sep_idx = lit_snip.len() - suffix.len() - 1; + let maybe_last_sep_idx = if let Some(val) = lit_snip.len().checked_sub(suffix.len() + 1) { + val + } else { + return; // It's useless so shouldn't lint. + }; // Do not lint when literal is unsuffixed. if !suffix.is_empty() && lit_snip.as_bytes()[maybe_last_sep_idx] != b'_' { span_lint_and_sugg( @@ -502,7 +506,7 @@ impl MiscEarlyLints { ); } - if lit_snip.starts_with("0x") { + if lit_snip.starts_with("0x") && maybe_last_sep_idx >= 3 { let mut seen = (false, false); for ch in lit_snip.as_bytes()[2..=maybe_last_sep_idx].iter() { match ch { @@ -546,7 +550,11 @@ impl MiscEarlyLints { } } else if let LitKind::Float(_, LitFloatType::Suffixed(float_ty)) = lit.kind { let suffix = float_ty.name_str(); - let maybe_last_sep_idx = lit_snip.len() - suffix.len() - 1; + let maybe_last_sep_idx = if let Some(val) = lit_snip.len().checked_sub(suffix.len() + 1) { + val + } else { + return; // It's useless so shouldn't lint. + }; if lit_snip.as_bytes()[maybe_last_sep_idx] != b'_' { span_lint_and_sugg( cx,