Fix false-positive in expr_or_init
and in the invalid_from_utf8
lint
This commit is contained in:
parent
3ea711f17e
commit
faa5b3f7de
3 changed files with 58 additions and 64 deletions
|
@ -6,6 +6,7 @@
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use std::slice;
|
use std::slice;
|
||||||
|
|
||||||
|
use rustc_ast::BindingMode;
|
||||||
use rustc_data_structures::fx::FxIndexMap;
|
use rustc_data_structures::fx::FxIndexMap;
|
||||||
use rustc_data_structures::sync;
|
use rustc_data_structures::sync;
|
||||||
use rustc_data_structures::unord::UnordMap;
|
use rustc_data_structures::unord::UnordMap;
|
||||||
|
@ -14,6 +15,7 @@ use rustc_feature::Features;
|
||||||
use rustc_hir::def::Res;
|
use rustc_hir::def::Res;
|
||||||
use rustc_hir::def_id::{CrateNum, DefId};
|
use rustc_hir::def_id::{CrateNum, DefId};
|
||||||
use rustc_hir::definitions::{DefPathData, DisambiguatedDefPathData};
|
use rustc_hir::definitions::{DefPathData, DisambiguatedDefPathData};
|
||||||
|
use rustc_hir::{Pat, PatKind};
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::middle::privacy::EffectiveVisibilities;
|
use rustc_middle::middle::privacy::EffectiveVisibilities;
|
||||||
use rustc_middle::ty::layout::{LayoutError, LayoutOfHelpers, TyAndLayout};
|
use rustc_middle::ty::layout::{LayoutError, LayoutOfHelpers, TyAndLayout};
|
||||||
|
@ -890,7 +892,12 @@ impl<'tcx> LateContext<'tcx> {
|
||||||
}
|
}
|
||||||
&& let Some(init) = match parent_node {
|
&& let Some(init) = match parent_node {
|
||||||
hir::Node::Expr(expr) => Some(expr),
|
hir::Node::Expr(expr) => Some(expr),
|
||||||
hir::Node::LetStmt(hir::LetStmt { init, .. }) => *init,
|
hir::Node::LetStmt(hir::LetStmt {
|
||||||
|
init,
|
||||||
|
// Binding is immutable, init cannot be re-assigned
|
||||||
|
pat: Pat { kind: PatKind::Binding(BindingMode::NONE, ..), .. },
|
||||||
|
..
|
||||||
|
}) => *init,
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -935,7 +942,12 @@ impl<'tcx> LateContext<'tcx> {
|
||||||
}
|
}
|
||||||
&& let Some(init) = match parent_node {
|
&& let Some(init) = match parent_node {
|
||||||
hir::Node::Expr(expr) => Some(expr),
|
hir::Node::Expr(expr) => Some(expr),
|
||||||
hir::Node::LetStmt(hir::LetStmt { init, .. }) => *init,
|
hir::Node::LetStmt(hir::LetStmt {
|
||||||
|
init,
|
||||||
|
// Binding is immutable, init cannot be re-assigned
|
||||||
|
pat: Pat { kind: PatKind::Binding(BindingMode::NONE, ..), .. },
|
||||||
|
..
|
||||||
|
}) => *init,
|
||||||
hir::Node::Item(item) => match item.kind {
|
hir::Node::Item(item) => match item.kind {
|
||||||
hir::ItemKind::Const(.., body_id) | hir::ItemKind::Static(.., body_id) => {
|
hir::ItemKind::Const(.., body_id) | hir::ItemKind::Static(.., body_id) => {
|
||||||
Some(self.tcx.hir_body(body_id).value)
|
Some(self.tcx.hir_body(body_id).value)
|
||||||
|
|
|
@ -128,18 +128,21 @@ pub fn from_utf8() {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_utf8_with_indirections() {
|
pub fn from_utf8_with_indirections() {
|
||||||
let mut a = [99, 108, 130, 105, 112, 112, 121];
|
// NOTE: We used to lint on the patterns below, but due to the
|
||||||
std::str::from_utf8_mut(&mut a);
|
// binding being mutable it could be changed between the
|
||||||
//~^ WARN calls to `std::str::from_utf8_mut`
|
// declaration and the call and that would have created a
|
||||||
str::from_utf8_mut(&mut a);
|
// false-positive, so until we can reliably avoid those false
|
||||||
//~^ WARN calls to `str::from_utf8_mut`
|
// postive we don't lint on them. Example of FP below.
|
||||||
let mut b = &mut a;
|
//
|
||||||
let mut c = b;
|
// let mut a = [99, 108, 130, 105, 112, 112, 121];
|
||||||
std::str::from_utf8_mut(c);
|
// std::str::from_utf8_mut(&mut a);
|
||||||
//~^ WARN calls to `std::str::from_utf8_mut`
|
// str::from_utf8_mut(&mut a);
|
||||||
str::from_utf8_mut(c);
|
// let mut b = &mut a;
|
||||||
//~^ WARN calls to `str::from_utf8_mut`
|
// let mut c = b;
|
||||||
let mut c = &[99, 108, 130, 105, 112, 112, 121];
|
// std::str::from_utf8_mut(c);
|
||||||
|
// str::from_utf8_mut(c);
|
||||||
|
|
||||||
|
let c = &[99, 108, 130, 105, 112, 112, 121];
|
||||||
std::str::from_utf8(c);
|
std::str::from_utf8(c);
|
||||||
//~^ WARN calls to `std::str::from_utf8`
|
//~^ WARN calls to `std::str::from_utf8`
|
||||||
str::from_utf8(c);
|
str::from_utf8(c);
|
||||||
|
@ -164,6 +167,20 @@ pub fn from_utf8_with_indirections() {
|
||||||
//~^ WARN calls to `std::str::from_utf8`
|
//~^ WARN calls to `std::str::from_utf8`
|
||||||
str::from_utf8(INVALID_4);
|
str::from_utf8(INVALID_4);
|
||||||
//~^ WARN calls to `str::from_utf8`
|
//~^ WARN calls to `str::from_utf8`
|
||||||
|
|
||||||
|
let mut a = [99, 108, 130, 105, 112, 112, 121]; // invalid
|
||||||
|
loop {
|
||||||
|
a = [99, 108, 130, 105, 112, 112, 121]; // still invalid, but too complex
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
std::str::from_utf8_mut(&mut a);
|
||||||
|
|
||||||
|
let mut a = [99, 108, 130, 105, 112, 112]; // invalid
|
||||||
|
loop {
|
||||||
|
a = *b"clippy"; // valid
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
std::str::from_utf8_mut(&mut a);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -202,60 +202,25 @@ LL | str::from_utf8(concat_bytes!(b"cl", b"\x82ippy"));
|
||||||
| |
|
| |
|
||||||
| the literal was valid UTF-8 up to the 2 bytes
|
| the literal was valid UTF-8 up to the 2 bytes
|
||||||
|
|
||||||
warning: calls to `std::str::from_utf8_mut` with an invalid literal always return an error
|
|
||||||
--> $DIR/invalid_from_utf8.rs:132:5
|
|
||||||
|
|
|
||||||
LL | let mut a = [99, 108, 130, 105, 112, 112, 121];
|
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
|
||||||
LL | std::str::from_utf8_mut(&mut a);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: calls to `str::from_utf8_mut` with an invalid literal always return an error
|
|
||||||
--> $DIR/invalid_from_utf8.rs:134:5
|
|
||||||
|
|
|
||||||
LL | let mut a = [99, 108, 130, 105, 112, 112, 121];
|
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
|
||||||
...
|
|
||||||
LL | str::from_utf8_mut(&mut a);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: calls to `std::str::from_utf8_mut` with an invalid literal always return an error
|
|
||||||
--> $DIR/invalid_from_utf8.rs:138:5
|
|
||||||
|
|
|
||||||
LL | let mut a = [99, 108, 130, 105, 112, 112, 121];
|
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
|
||||||
...
|
|
||||||
LL | std::str::from_utf8_mut(c);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: calls to `str::from_utf8_mut` with an invalid literal always return an error
|
|
||||||
--> $DIR/invalid_from_utf8.rs:140:5
|
|
||||||
|
|
|
||||||
LL | let mut a = [99, 108, 130, 105, 112, 112, 121];
|
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
|
||||||
...
|
|
||||||
LL | str::from_utf8_mut(c);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
warning: calls to `std::str::from_utf8` with an invalid literal always return an error
|
warning: calls to `std::str::from_utf8` with an invalid literal always return an error
|
||||||
--> $DIR/invalid_from_utf8.rs:143:5
|
--> $DIR/invalid_from_utf8.rs:146:5
|
||||||
|
|
|
|
||||||
LL | let mut c = &[99, 108, 130, 105, 112, 112, 121];
|
LL | let c = &[99, 108, 130, 105, 112, 112, 121];
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
||||||
LL | std::str::from_utf8(c);
|
LL | std::str::from_utf8(c);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: calls to `str::from_utf8` with an invalid literal always return an error
|
warning: calls to `str::from_utf8` with an invalid literal always return an error
|
||||||
--> $DIR/invalid_from_utf8.rs:145:5
|
--> $DIR/invalid_from_utf8.rs:148:5
|
||||||
|
|
|
|
||||||
LL | let mut c = &[99, 108, 130, 105, 112, 112, 121];
|
LL | let c = &[99, 108, 130, 105, 112, 112, 121];
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
||||||
...
|
...
|
||||||
LL | str::from_utf8(c);
|
LL | str::from_utf8(c);
|
||||||
| ^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: calls to `std::str::from_utf8` with an invalid literal always return an error
|
warning: calls to `std::str::from_utf8` with an invalid literal always return an error
|
||||||
--> $DIR/invalid_from_utf8.rs:148:5
|
--> $DIR/invalid_from_utf8.rs:151:5
|
||||||
|
|
|
|
||||||
LL | const INVALID_1: [u8; 7] = [99, 108, 130, 105, 112, 112, 121];
|
LL | const INVALID_1: [u8; 7] = [99, 108, 130, 105, 112, 112, 121];
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
||||||
|
@ -263,7 +228,7 @@ LL | std::str::from_utf8(&INVALID_1);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: calls to `str::from_utf8` with an invalid literal always return an error
|
warning: calls to `str::from_utf8` with an invalid literal always return an error
|
||||||
--> $DIR/invalid_from_utf8.rs:150:5
|
--> $DIR/invalid_from_utf8.rs:153:5
|
||||||
|
|
|
|
||||||
LL | const INVALID_1: [u8; 7] = [99, 108, 130, 105, 112, 112, 121];
|
LL | const INVALID_1: [u8; 7] = [99, 108, 130, 105, 112, 112, 121];
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
||||||
|
@ -272,7 +237,7 @@ LL | str::from_utf8(&INVALID_1);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: calls to `std::str::from_utf8` with an invalid literal always return an error
|
warning: calls to `std::str::from_utf8` with an invalid literal always return an error
|
||||||
--> $DIR/invalid_from_utf8.rs:153:5
|
--> $DIR/invalid_from_utf8.rs:156:5
|
||||||
|
|
|
|
||||||
LL | static INVALID_2: [u8; 7] = [99, 108, 130, 105, 112, 112, 121];
|
LL | static INVALID_2: [u8; 7] = [99, 108, 130, 105, 112, 112, 121];
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
||||||
|
@ -280,7 +245,7 @@ LL | std::str::from_utf8(&INVALID_2);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: calls to `str::from_utf8` with an invalid literal always return an error
|
warning: calls to `str::from_utf8` with an invalid literal always return an error
|
||||||
--> $DIR/invalid_from_utf8.rs:155:5
|
--> $DIR/invalid_from_utf8.rs:158:5
|
||||||
|
|
|
|
||||||
LL | static INVALID_2: [u8; 7] = [99, 108, 130, 105, 112, 112, 121];
|
LL | static INVALID_2: [u8; 7] = [99, 108, 130, 105, 112, 112, 121];
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
||||||
|
@ -289,7 +254,7 @@ LL | str::from_utf8(&INVALID_2);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: calls to `std::str::from_utf8` with an invalid literal always return an error
|
warning: calls to `std::str::from_utf8` with an invalid literal always return an error
|
||||||
--> $DIR/invalid_from_utf8.rs:158:5
|
--> $DIR/invalid_from_utf8.rs:161:5
|
||||||
|
|
|
|
||||||
LL | const INVALID_3: &'static [u8; 7] = &[99, 108, 130, 105, 112, 112, 121];
|
LL | const INVALID_3: &'static [u8; 7] = &[99, 108, 130, 105, 112, 112, 121];
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
||||||
|
@ -297,7 +262,7 @@ LL | std::str::from_utf8(INVALID_3);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: calls to `str::from_utf8` with an invalid literal always return an error
|
warning: calls to `str::from_utf8` with an invalid literal always return an error
|
||||||
--> $DIR/invalid_from_utf8.rs:160:5
|
--> $DIR/invalid_from_utf8.rs:163:5
|
||||||
|
|
|
|
||||||
LL | const INVALID_3: &'static [u8; 7] = &[99, 108, 130, 105, 112, 112, 121];
|
LL | const INVALID_3: &'static [u8; 7] = &[99, 108, 130, 105, 112, 112, 121];
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
||||||
|
@ -306,7 +271,7 @@ LL | str::from_utf8(INVALID_3);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: calls to `std::str::from_utf8` with an invalid literal always return an error
|
warning: calls to `std::str::from_utf8` with an invalid literal always return an error
|
||||||
--> $DIR/invalid_from_utf8.rs:163:5
|
--> $DIR/invalid_from_utf8.rs:166:5
|
||||||
|
|
|
|
||||||
LL | const INVALID_4: &'static [u8; 7] = { &[99, 108, 130, 105, 112, 112, 121] };
|
LL | const INVALID_4: &'static [u8; 7] = { &[99, 108, 130, 105, 112, 112, 121] };
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
||||||
|
@ -314,7 +279,7 @@ LL | std::str::from_utf8(INVALID_4);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: calls to `str::from_utf8` with an invalid literal always return an error
|
warning: calls to `str::from_utf8` with an invalid literal always return an error
|
||||||
--> $DIR/invalid_from_utf8.rs:165:5
|
--> $DIR/invalid_from_utf8.rs:168:5
|
||||||
|
|
|
|
||||||
LL | const INVALID_4: &'static [u8; 7] = { &[99, 108, 130, 105, 112, 112, 121] };
|
LL | const INVALID_4: &'static [u8; 7] = { &[99, 108, 130, 105, 112, 112, 121] };
|
||||||
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
| ---------------------------------- the literal was valid UTF-8 up to the 2 bytes
|
||||||
|
@ -322,5 +287,5 @@ LL | const INVALID_4: &'static [u8; 7] = { &[99, 108, 130, 105, 112, 112, 12
|
||||||
LL | str::from_utf8(INVALID_4);
|
LL | str::from_utf8(INVALID_4);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: 38 warnings emitted
|
warning: 34 warnings emitted
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue