check for .to_string().into_bytes() in string_lit_to_bytes

apply changes from review
This commit is contained in:
Elliot Bobrow 2021-03-23 17:10:27 -07:00
parent b80903b727
commit e9ebc27525
4 changed files with 56 additions and 3 deletions

View File

@ -284,6 +284,35 @@ impl<'tcx> LateLintPass<'tcx> for StringLitAsBytes {
}
}
}
if_chain! {
if let ExprKind::MethodCall(path, _, [recv], _) = &e.kind;
if path.ident.name == sym!(into_bytes);
if let ExprKind::MethodCall(path, _, [recv], _) = &recv.kind;
if matches!(&*path.ident.name.as_str(), "to_owned" | "to_string");
if let ExprKind::Lit(lit) = &recv.kind;
if let LitKind::Str(lit_content, _) = &lit.node;
if lit_content.as_str().is_ascii();
if lit_content.as_str().len() <= MAX_LENGTH_BYTE_STRING_LIT;
if !recv.span.from_expansion();
then {
let mut applicability = Applicability::MachineApplicable;
span_lint_and_sugg(
cx,
STRING_LIT_AS_BYTES,
e.span,
"calling `into_bytes()` on a string literal",
"consider using a byte string literal instead",
format!(
"b{}.to_vec()",
snippet_with_applicability(cx, recv.span, r#""..""#, &mut applicability)
),
applicability,
);
}
}
}
}

View File

@ -8,10 +8,16 @@ fn str_lit_as_bytes() {
let bs = br###"raw string with 3# plus " ""###;
let bs = b"lit to string".to_vec();
let bs = b"lit to owned".to_vec();
// no warning, because these cannot be written as byte string literals:
let ubs = "".as_bytes();
let ubs = "hello there! this is a very long string".as_bytes();
let ubs = "".to_string().into_bytes();
let ubs = "this is also too long and shouldn't be fixed".to_string().into_bytes();
let strify = stringify!(foobar).as_bytes();
let current_version = env!("CARGO_PKG_VERSION").as_bytes();

View File

@ -8,10 +8,16 @@ fn str_lit_as_bytes() {
let bs = r###"raw string with 3# plus " ""###.as_bytes();
let bs = "lit to string".to_string().into_bytes();
let bs = "lit to owned".to_owned().into_bytes();
// no warning, because these cannot be written as byte string literals:
let ubs = "".as_bytes();
let ubs = "hello there! this is a very long string".as_bytes();
let ubs = "".to_string().into_bytes();
let ubs = "this is also too long and shouldn't be fixed".to_string().into_bytes();
let strify = stringify!(foobar).as_bytes();
let current_version = env!("CARGO_PKG_VERSION").as_bytes();

View File

@ -12,17 +12,29 @@ error: calling `as_bytes()` on a string literal
LL | let bs = r###"raw string with 3# plus " ""###.as_bytes();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a byte string literal instead: `br###"raw string with 3# plus " ""###`
error: calling `into_bytes()` on a string literal
--> $DIR/string_lit_as_bytes.rs:11:14
|
LL | let bs = "lit to string".to_string().into_bytes();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a byte string literal instead: `b"lit to string".to_vec()`
error: calling `into_bytes()` on a string literal
--> $DIR/string_lit_as_bytes.rs:12:14
|
LL | let bs = "lit to owned".to_owned().into_bytes();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a byte string literal instead: `b"lit to owned".to_vec()`
error: calling `as_bytes()` on `include_str!(..)`
--> $DIR/string_lit_as_bytes.rs:19:22
--> $DIR/string_lit_as_bytes.rs:25:22
|
LL | let includestr = include_str!("entry_unfixable.rs").as_bytes();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `include_bytes!(..)` instead: `include_bytes!("entry_unfixable.rs")`
error: calling `as_bytes()` on a string literal
--> $DIR/string_lit_as_bytes.rs:21:13
--> $DIR/string_lit_as_bytes.rs:27:13
|
LL | let _ = "string with newline/t/n".as_bytes();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a byte string literal instead: `b"string with newline/t/n"`
error: aborting due to 4 previous errors
error: aborting due to 6 previous errors