]> git.lizzy.rs Git - rust.git/commitdiff
Fix `to_string_in_format_args` false positive
authorSamuel E. Moelius III <sam@moeli.us>
Fri, 29 Jul 2022 09:34:49 +0000 (05:34 -0400)
committerSamuel Moelius <samuel.moelius@trailofbits.com>
Sun, 21 Aug 2022 19:38:09 +0000 (19:38 +0000)
clippy_lints/src/format_args.rs
tests/ui/format_args.fixed
tests/ui/format_args.rs
tests/ui/format_args.stderr

index 5347ff880ce010826103879c8d9ac741e72a6919..473c9a8675f13fb7dadd93858b1bec62afb98b6e 100644 (file)
@@ -131,34 +131,49 @@ fn check_to_string_in_format_args(cx: &LateContext<'_>, name: Symbol, value: &Ex
         if is_diag_trait_item(cx, method_def_id, sym::ToString);
         let receiver_ty = cx.typeck_results().expr_ty(receiver);
         if let Some(display_trait_id) = cx.tcx.get_diagnostic_item(sym::Display);
+        let (n_needed_derefs, target) =
+            count_needed_derefs(receiver_ty, cx.typeck_results().expr_adjustments(receiver).iter());
+        if implements_trait(cx, target, display_trait_id, &[]);
+        if let Some(sized_trait_id) = cx.tcx.lang_items().sized_trait();
         if let Some(receiver_snippet) = snippet_opt(cx, receiver.span);
         then {
-            let (n_needed_derefs, target) = count_needed_derefs(
-                receiver_ty,
-                cx.typeck_results().expr_adjustments(receiver).iter(),
-            );
-            if implements_trait(cx, target, display_trait_id, &[]) {
-                if n_needed_derefs == 0 {
-                    span_lint_and_sugg(
-                        cx,
-                        TO_STRING_IN_FORMAT_ARGS,
-                        value.span.with_lo(receiver.span.hi()),
-                        &format!("`to_string` applied to a type that implements `Display` in `{}!` args", name),
-                        "remove this",
-                        String::new(),
-                        Applicability::MachineApplicable,
-                    );
-                } else {
-                    span_lint_and_sugg(
-                        cx,
-                        TO_STRING_IN_FORMAT_ARGS,
-                        value.span,
-                        &format!("`to_string` applied to a type that implements `Display` in `{}!` args", name),
-                        "use this",
-                        format!("{:*>width$}{}", "", receiver_snippet, width = n_needed_derefs),
-                        Applicability::MachineApplicable,
-                    );
-                }
+            let needed_ref = if implements_trait(cx, receiver_ty, sized_trait_id, &[]) {
+                ""
+            } else {
+                "&"
+            };
+            if n_needed_derefs == 0 && needed_ref.is_empty() {
+                span_lint_and_sugg(
+                    cx,
+                    TO_STRING_IN_FORMAT_ARGS,
+                    value.span.with_lo(receiver.span.hi()),
+                    &format!(
+                        "`to_string` applied to a type that implements `Display` in `{}!` args",
+                        name
+                    ),
+                    "remove this",
+                    String::new(),
+                    Applicability::MachineApplicable,
+                );
+            } else {
+                span_lint_and_sugg(
+                    cx,
+                    TO_STRING_IN_FORMAT_ARGS,
+                    value.span,
+                    &format!(
+                        "`to_string` applied to a type that implements `Display` in `{}!` args",
+                        name
+                    ),
+                    "use this",
+                    format!(
+                        "{}{:*>width$}{}",
+                        needed_ref,
+                        "",
+                        receiver_snippet,
+                        width = n_needed_derefs
+                    ),
+                    Applicability::MachineApplicable,
+                );
             }
         }
     }
index e07cae7027706d016712b01aad52ee81e41ea348..e1c2d4d70be4f65effd89e0d84edfa3b77fcf3bd 100644 (file)
@@ -146,3 +146,17 @@ mod issue_8855 {
         dbg!(x);
     }
 }
+
+// https://github.com/rust-lang/rust-clippy/issues/9256
+mod issue_9256 {
+    #![allow(dead_code)]
+
+    fn print_substring(original: &str) {
+        assert!(original.len() > 10);
+        println!("{}", &original[..10]);
+    }
+
+    fn main() {
+        print_substring("Hello, world!");
+    }
+}
index 86e66bce2c5f410c66acf33bb4ebb92d9e7381c1..b9a4d66c28ad9f4f85390dc427dca8d08e66bcdc 100644 (file)
@@ -146,3 +146,17 @@ fn main() {
         dbg!(x);
     }
 }
+
+// https://github.com/rust-lang/rust-clippy/issues/9256
+mod issue_9256 {
+    #![allow(dead_code)]
+
+    fn print_substring(original: &str) {
+        assert!(original.len() > 10);
+        println!("{}", original[..10].to_string());
+    }
+
+    fn main() {
+        print_substring("Hello, world!");
+    }
+}
index e69999cc9d0215f37e6e74aba1fbc905784ce189..aa6e3659b43b519d19f14fa7ecd395a7d7763bda 100644 (file)
@@ -132,5 +132,11 @@ error: `to_string` applied to a type that implements `Display` in `format!` args
 LL |         let x = format!("{} {}", a, b.to_string());
    |                                      ^^^^^^^^^^^^ help: remove this
 
-error: aborting due to 22 previous errors
+error: `to_string` applied to a type that implements `Display` in `println!` args
+  --> $DIR/format_args.rs:156:24
+   |
+LL |         println!("{}", original[..10].to_string());
+   |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use this: `&original[..10]`
+
+error: aborting due to 23 previous errors